2010-12-06 30 views
0

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

+1

Quelle est l'erreur que vous obtenez dans DDMS? – kthorat

+0

Pourquoi avez-vous deux 'PRIMARY KEY' pour le BEEF_TABLE? – Pentium10

Répondre

1

Je me demande si DatabaseHelper.onCreate() est appelée lorsque vous exécutez l'application. Si vous n'êtes pas sûr, alors établissez un point d'arrêt là et voyez. S'il n'est pas appelé, une ancienne version de votre base de données est utilisée, et cette version n'a peut-être pas la table "chicken". Essayez de désinstaller l'application et de l'exécuter à nouveau (elle sera installée automatiquement.Si cela s'avère être le problème, vous pouvez déplacer tous les futurs appels CREATE TABLE IF NOT EXISTS dans une méthode commune qui serait appelée à partir de onCreate et onUpgrade, et veillez à incrémenter vos numéros de version de base de données. comme vous le faites.

+0

Oui! c'était ça, j'ai désinstallé et réinstallé, j'ai aussi oublié d'ajouter la clé primaire dans la colonne, quand j'ai rajouté que ça marchait! Merci beaucoup, je ne pouvais pas comprendre – SickNick