Je suis en train d'écrire ma première application, et j'essaie également d'intégrer une base de données, et je suis vraiment aux prises avec cela. Ce que j'essaie de faire, c'est d'avoir plusieurs filateurs, et ces filateurs obtiennent leurs données à partir d'une base de données. Chaque spinner fera une requête différente.Problèmes de requête SQlite, provoquant la fermeture de la force
Jusqu'à présent, c'est ce que j'ai: DBUTILITY
import android.content.Context;
importation android.database.Cursor; importez android.database.sqlite.SQLiteDatabase; importez android.database.sqlite.SQLiteOpenHelper; importez android.database.sqlite.SQLiteDatabase.CursorFactory; importez android.widget.SimpleCursorAdapter;
public class DBUTILITY {
static final String DB_NAME="food";
static final String BEEF_TABLE="beef";
static final String CHICKEN_TABLE="chicken";
SQLiteDatabase db=null;
Context context;
public static class DatabaseHelper extends SQLiteOpenHelper
{
public DatabaseHelper(Context context, String name, CursorFactory factory, int version)
{
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE IF NOT EXISTS "+BEEF_TABLE+" (_id INT PRIMARY KEY, cookTime INT PRIMARY KEY ,name VARCHAR);");
db.execSQL("INSERT INTO "+BEEF_TABLE+" values(5000,'Skirt Steak');");
db.execSQL("INSERT INTO "+BEEF_TABLE+" values(10000,'Flank Steak');");
db.execSQL("INSERT INTO "+BEEF_TABLE+" values(15000,'Filet Mignon');");
db.execSQL("CREATE TABLE IF NOT EXISTS "+CHICKEN_TABLE+" (_id INT PRIMARY KEY, cookTime INT PRIMARY KEY ,name VARCHAR);");
db.execSQL("INSERT INTO "+CHICKEN_TABLE+" values(5000,'Breast');");
db.execSQL("INSERT INTO "+CHICKEN_TABLE+" values(10000,'Wings');");
db.execSQL("INSERT INTO "+CHICKEN_TABLE+" values(15000,'Burger');");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public DbUtility(Context context) {
this.context=context;
}
public SimpleCursorAdapter getBeefAdapter()
{
DatabaseHelper dbhelper=new DatabaseHelper(this.context, DB_NAME, null, 1);
db=dbhelper.getWritableDatabase();
Cursor beefCursor=db.rawQuery("SELECT * FROM "+BEEF_TABLE, null);
while(!beefCursor.isLast())
beefCursor.moveToNext(); //I don't understand why but it's necessary (alternative call c.getCount())
String[] from=new String[1];
from[0]="name";
int[] to=new int[1];
to[0]=android.R.id.text1;
SimpleCursorAdapter beefAdapter=new SimpleCursorAdapter(this.context, android.R.layout.simple_spinner_item, beefCursor, from, to);
beefAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
db.close();
return beefAdapter;
}
public SimpleCursorAdapter getChickenAdapter()
{
DatabaseHelper dbhelper=new DatabaseHelper(this.context, DB_NAME, null, 1);
db=dbhelper.getWritableDatabase();
Cursor chickenCursor=db.rawQuery("SELECT * FROM "+CHICKEN_TABLE, null);//If I change this to BEEF_TABLE it doesn't force close...
while(!chickenCursor.isLast())
chickenCursor.moveToNext(); //I don't understand why but it's necessary (alternative call c.getCount())
String[] from=new String[1];
from[0]="name";
int[] to=new int[1];
to[0]=android.R.id.text1;
SimpleCursorAdapter chickenAdapter=new SimpleCursorAdapter(this.context, android.R.layout.simple_spinner_item, chickenCursor, from, to);
chickenAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
db.close();
return chickenAdapter;
}
}
et j'ai aussi mon chickenActivity, c'est là mes fileurs sont:
package com.tsilo.grillbuddy;
importer android.app.Activity; importez android.os.Bundle; importez android.widget.SimpleCursorAdapter; importez android.widget.Spinner;
public class ChickenActivity extends Activité { /** Appelée lors de la première création de l'activité. */ @Override public void onCreate (groupe savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.spinner);
DbUtility db=new DbUtility(this);
SimpleCursorAdapter beefAdapter=db.getBeefAdapter();
Spinner beefSpinner=(Spinner)this.findViewById(R.id.spinner);
beefSpinner.setAdapter(beefAdapter);
SimpleCursorAdapter chickenAdapter=db.getChickenAdapter();
Spinner chickenSpinner=(Spinner)this.findViewById(R.id.spinner2);
chickenSpinner.setAdapter(chickenAdapter);
}
}
C'est ce que j'ai remarqué:
Si je change getChickenAdapter() il interroge BEEF_TABLE, cela fonctionne, il est seulement quand je passe à CHICKEN_TABLE, que la force ferme .
Mon DDMS Erreur:
12-06 16: 03: 12,473: INFO/Base de données (11856): sqlite retourné: code d'erreur = 1, msg = pas de table: poulet 12-06 16: 03: 12.473: DEBUG/AndroidRuntime (11856): Arrêt de la machine virtuelle 12-06 16: 03: 12.473: WARN/dalvikvm (11856): threadid = 1: thread sortant avec une exception non interceptée (groupe = 0x4001d7f0) 12- 06 16: 03: 12.483: ERROR/AndroidRuntime (11856): EXCEPTION FATALE: principal 12-06 16: 03: 12.483: ERROR/AndroidRuntime (11856): java.lang.RuntimeException: Impossible de démarrer l'activité ComponentInfo {com.tsilo .grillbuddy/com.tsilo.grillbuddy.ChickenAct ivity}: android.database.sqlite.SQLiteException: pas une telle table: poulet:, lors de la compilation: SELECT * FROM poulet
Quelle est l'erreur que vous obtenez dans DDMS? – kthorat
Pourquoi avez-vous deux 'PRIMARY KEY' pour le BEEF_TABLE? – Pentium10