Проблемы с SQlite Query, вызывающие Force Close - PullRequest
0 голосов
/ 06 декабря 2010

Я пишу свое первое приложение, и я также пытаюсь включить базу данных, и я действительно борюсь с ней. То, что я пытаюсь сделать, - это иметь несколько счетчиков, и эти счетчики получают свои данные из базы данных. Каждый счетчик выполнит свой запрос.

Пока это то, что у меня есть: DBUtility

import android.content.Context;

import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.widget.SimpleCursorAdapter;

открытый класс 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;  
}   

}

и у меня также есть функция chickenActivity, здесь мои счетчики:

пакет com.tsilo.grillbuddy;

импорт android.app.Activity; импорт android.os.Bundle; import android.widget.SimpleCursorAdapter; импорт android.widget.Spinner;

открытый класс ChickenActivity расширяет Activity { / ** Вызывается при первом создании действия. * / @Override public void onCreate (BundlevedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.spinner); * +1019 *

    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);            
}
* *} Тысяча двадцать-один

Вот что я заметил:
Если я изменяю свой getChickenAdapter (), чтобы он запрашивал BEEF_TABLE, он работает, только когда я переключаю его на CHICKEN_TABLE, он принудительно закрывается.


Моя ошибка DDMS:

12-06 16: 03: 12.473: INFO / База данных (11856): sqlite вернул: код ошибки = 1, msg = нет такой таблицы: курица 12-06 16: 03: 12.473: DEBUG / AndroidRuntime (11856): выключение виртуальной машины 12-06 16: 03: 12.473: WARN / dalvikvm (11856): threadid = 1: поток выходит с необработанным исключением (группа = 0x4001d7f0) 12-06 16: 03: 12.483: ОШИБКА / AndroidRuntime (11856): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 12-06 16: 03: 12.483: ОШИБКА / AndroidRuntime (11856): java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.tsilo.grillbuddy / com.tsilo.grillbuddy.ChickenActivity}: android.database.sqlite.SQLiteException : такой таблицы нет: chicken: при компиляции: SELECT * FROM chicken

1 Ответ

1 голос
/ 07 декабря 2010

Мне интересно, вызывается ли DatabaseHelper.onCreate() при запуске приложения.Если вы не уверены, тогда установите точку останова и посмотрите.Если он не вызывается, то используется более старая версия вашей базы данных, и, возможно, эта версия не имеет таблицы «курица».Попробуйте удалить приложение и запустить его снова (оно будет установлено автоматически.)

Если это окажется проблемой, вы можете переместить любые будущие вызовы CREATE TABLE IF NOT EXISTS в общий метод, которыйбудет вызываться как с onCreate, так и с onUpgrade, и при этом обязательно увеличьте номера версий вашей БД.

...