2010-12-06 37 views
0

我正在編寫我的第一個應用程序,並且我也試圖合併一個數據庫,並且我非常努力。我試圖做的是有多個spinners,那些spinners從數據庫中獲取他們的數據。每個微調器都會執行不同的查詢。SQlite查詢問題,導致強制關閉

到目前爲止,這是我:DBUtility

import android.content.Context; 

進口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;

import android.app.Activity; import android.os.Bundle; import android.widget.SimpleCursorAdapter; import android.widget.Spinner;

公共類ChickenActivity extends Activity活動第一次創建時調用。 */ @Override public void onCreate(Bundle 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);    
} 

}

這是我已經注意到:
如果我改變我的getChickenAdapter(),所以它查詢BEEF_TABLE,它的工作原理,只有當我切換到CHICKEN_TABLE,它強制關閉。


我DDMS錯誤:

12-06 16:03:12.473:INFO /數據庫(11856):源碼返回:錯誤代碼= 1,味精=沒有這樣的表:雞 12-06 16:03:12.473:DEBUG/AndroidRuntime(11856):關閉虛擬機 12-06 16:03:12.473:WARN/dalvikvm(11856):threadid = 1:線程以未捕獲的異常退出(group = 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.ChickenAct ivity}:android.database.sqlite.SQLiteException:沒有這樣的表:雞:,編譯時:SELECT * FROM chicken

+1

您在DDMS中遇到的錯誤是什麼? – kthorat 2010-12-06 20:39:22

+0

爲什麼BEEF_TABLE有兩個`PRIMARY KEY`? – Pentium10 2010-12-06 20:41:28

回答

1

我想知道DatabaseHelper.onCreate()是否在運行應用程序時被調用。如果你不確定,那就在那裏設置一個斷點,然後看看。如果它沒有被調用,那麼你的數據庫的一箇舊版本正在使用,也許該版本沒有「雞」表。嘗試卸載應用程序並再次運行它(它會自動安裝。)

如果事實證明是這個問題,您可能希望將未來的任何CREATE TABLE IF NOT EXISTS調用移入將從onCreateonUpgrade中調用的常用方法,並確保將您的DB版本號正如你這樣做。