2014-01-08 82 views
-1

我有一個名爲GameDb的類,它擴展了SQLiteOpenHelper。我不知道爲什麼,但創建它沒有被調用,表沒有創建!Android SQLiteDatabase表不存在

有我的所有活動和片段一singelton:

public MyApp extends Application 
{ 
    // .... Code 

    private GameDb gameDb; 

    public GameDb getGameDb() 
    { 
     if (gameDb == null) 
     gameDb = new GameDb(this); 

     return this.gameDb; 
    } 
} 

充分利用數據庫中的所有遊戲,從一個活動叫

public class MyActivity extends FragmentActivity 
{ 
    @Override 
    protected void onCreate(Bundle bundle) 
    { 
     // Code.... 

     // Get all games 
     ArrayList<Game> allGames = getMyApp().getGameDb().getAllGames(); 
    } 
} 

類,其中包含用於查詢數據庫中的所有必要的方法(寫作和閱讀)。這種方法不是在下面寫的,因爲它不是必需的。

public class GameDb 
{ 
    private SQLiteDatabase db; 
    private GameDbHelper dbHelper; 

    public GameDb(Context context) 
    { 
     this.dbHelper = new GameDbHelper(context); 
     this.db = dbHelper.getWritableDatabase(); 
    } 

    public ArrayList<Games> getAllGames() 
    { 
     // return db.query(....); 
    } 

    public void insertNewGame(int id, String name) 
    { 
     // db.query(....); 
    } 

    // Static inner class which extends SQLiteOpenHelper 
    private static class GameDbHelper extends SQLiteOpenHelper 
    { 
     public GameDbHelper(Context context) 
     { 
     super(context, "DB_NAME", null, 1); 
     } 

     // On create not called ! 
     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
     db.execSQL("CREATE TABLE my_table(_id INTEGER AUTOINCREMENT, date TEXT);"); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
     { 
     dropTable(db); 
     onCreate(db); 
     } 

     public void dropTable(SQLiteDatabase db) 
     { 
     db.execSQL("DROP TABLE IF EXISTS my_table"); 
     } 
    }  
} 

當我試圖讓所有的遊戲,或添加新的遊戲,我得到一個致命異常,(1)沒有這樣的表:MY_TABLE

+2

卸載並重新安裝您的應用程序,以便刪除任何可能的舊數據庫文件。 – laalto

+0

或只是在創建時增加db版本。 – njzk2

+0

@ njzk2的確,雖然我發現對於這類問題的初學者來說,卸載/清除數據的方式在開發過程中是最直接的。不需要執行'onUpgrade()'代碼路徑,並且不需要去任意大的版本號就可以使代碼更簡單。 – laalto

回答

1

你可能有一箇舊的數據庫上呈現使用IDE重新安裝應用程序時,您的設備和數據庫並不總是被刪除。因此,您必須手動卸載應用程序並使用IDE重新安裝應用程序。

0

我不相信當您實例化數據庫對象時,onCreate()會被隱式調用。你需要明確地調用你的Activity的openOrCreateDatabase()方法。