我有一个名为GameDb的类,它正在扩展SQLiteOpenHelper。我不知道为什么,但是创建它没有被调用,表格没有被创建!
对我的所有活动和片段都有一个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
答案 0 :(得分:1)
您的设备上可能存在旧数据库,并且在使用IDE重新安装应用程序时,数据库并不总是被删除。因此,您必须手动卸载应用程序并使用IDE重新安装应用程序。
答案 1 :(得分:0)
我不相信在实例化数据库对象时会隐式调用onCreate()。您需要显式调用Activity的openOrCreateDatabase()方法。