2011-09-05 53 views
2

我的應用程序有一個包含三個表格的數據庫:一個用於存儲它追蹤的人員的姓名,一個用於跟蹤正在進行的事件,另一個用於缺少更好的術語 - 進行設置。在getWritableDatabase/getReadableDatabase後沒有調用onCreate

我在應用程序啓動時加載第一個表格。我要求一個可讀的數據庫加載成員來顯示,然後我在列表更改時寫入數據庫。我在這裏沒有問題。

但是,其他兩張表我無法工作。輔助類中的代碼與類名和列名的例外情況相同,並且(至少直到我嘗試訪問表的點),使用該表的代碼也幾乎相同。

下面是我的助手類的代碼(我得爲每個表單獨的幫手,正如我所說,這是除了類名和列相同):

public class db_MembersOpenHelper extends SQLiteOpenHelper 
{ 
    public static final String TABLE_NAME = "members_table"; 
    public static final String[] COLUMN_NAMES = new String[] { 
      Constants.KEY_ID, 
      "name", 
      "score" 
    }; 
    private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + " (" 
      + COLUMN_NAMES[0] + " INTEGER PRIMARY KEY autoincrement, " 
      + COLUMN_NAMES[1] + " TEXT, " 
      + COLUMN_NAMES[2] + " INTEGER);"; 

    public db_MembersOpenHelper(Context context) 
    { 
     super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { db.execSQL(TABLE_CREATE); } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     Log.w("TaskDBAdapter", "Upgrading from version " + oldVersion + " to " + newVersion + "."); 
     // Do nothing. We do not have any updated DB version 
    } 
} 

下面是我如何使用它成功:

​​

這裏的地方失敗:

db_PlayersOpenHelper playersDbHelper = new db_PlayersOpenHelper(this); 
final SQLiteDatabase playersDb = playersDbHelper.getWritableDatabase(); 
if(newGame) 
{ 
    for(String name : players) 
    { 
     ContentValues row = new ContentValues(); 
     row.put(COLUMN_NAMES[1], name); 
     row.put(COLUMN_NAMES[2], (Integer)null); 
     playersDb.insert(TABLE_NAME, null, row); 
    } 
} 

第一個工程就像一個魅力。第二個結果在ERROR/Database(6739): Error inserting achievement_id=null name=c android.database.sqlite.SQLiteException: no such table: players_table: , while compiling: INSERT INTO players_table(achievement_id, name) VALUES(?, ?); ...

我做了一些測試,並且onCreate方法根本沒有被調用的表不工作。這可以解釋爲什麼我的手機認爲該表不存在,但我不知道爲什麼該方法沒有被調用。

我不明白這一點;我做了那麼一張桌子,我不小心和另一張桌子做得很對?

回答

5

我認爲問題在於你用三個助手管理三個表,但只使用一個數據庫。 SQLiteOpenHelper管理數據庫,而不是一個表。例如,它會在啓動時檢查數據庫而不是表是否存在。它已經做到了,所以onCreate()不會觸發。

我會用一個助手來管理所有表格。

+0

哦,好吧,這是有道理的。我誤解了幫手的工作方式。謝謝。 –

0

讓我看看我是否明白這一點。您正試圖用三個表創建一個數據庫。但是當你創建數據庫時,你只創建一個表;你在某個地方實例化了同一個數據庫,並想知道爲什麼它的onCreate方法沒有被調用。這是一個正確的解釋嗎?

我的策略是嘗試創建單個onCreate()方法中的所有三個表格。

0

如果您使用多個表格,那麼您必須一次創建所有表格。如果您先運行應用程序,稍後更新數據庫,則不會升級數據庫。

現在刪除你的應用程序,然後再運行它。

+0

http://pheide.com/page/11/tab/24#post13檢查整個鏈接。 –

0

還有一個解決方案,但它是不正確的。您可以聲明onOpen方法,您可以在其中調用onCreate。並在你的create table字符串中的表名之前添加IF NOT EXISTS。 - Sourabh剛剛編輯