我有一個名爲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
卸載並重新安裝您的應用程序,以便刪除任何可能的舊數據庫文件。 – laalto
或只是在創建時增加db版本。 – njzk2
@ njzk2的確,雖然我發現對於這類問題的初學者來說,卸載/清除數據的方式在開發過程中是最直接的。不需要執行'onUpgrade()'代碼路徑,並且不需要去任意大的版本號就可以使代碼更簡單。 – laalto