每次手機重新啓動時都會調用onUpgrade方法,我可以看到onUpgrade中的oldVersion參數永遠不會被調用。我試圖卸載應用程序,但沒有成功。奇怪的是,oldVersion總是6.或者還有其他原因,爲什麼每次手機重新啓動時我的數據庫都沒有了?Android SQLite無法升級數據庫
private static final int DATABASE_VERSION = 7;
private static class DatabaseHelper extends SQLiteOpenHelper {
/**
* jdbc Constructor.
*
* @param context
*/
Context mContext;
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
mContext = context;
}
/**
* @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
*/
public void onCreate(SQLiteDatabase db) {
LogToSD.write((getClass().toString() + " " + LogToSD.getMethodName(2)), "Enter");
try {
db.execSQL(DATABASE_CREATE_1);
db.execSQL(DATABASE_CREATE_2);
db.execSQL(DATABASE_CREATE_3);
db.execSQL(DATABASE_CREATE_4);
db.execSQL(DATABASE_CREATE_5);
} catch (Exception e) {
logger.error("Unable to query database", e);
}
}
/**
* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase,
* int, int)
*/
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
LogToSD.write((getClass().toString() + " " + LogToSD.getMethodName(2)), "Enter");
String version = "oldVersion " + Integer.toString(oldVersion) + " newVersion "
+ Integer.toString(newVersion);
LogToSD.write((getClass().toString() + " " + LogToSD.getMethodName(2)), version);
if (newVersion > oldVersion) {
try {
//DROP OLD
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_1);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_2);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_3);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_4);
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_5);
//CREATE NEW
onCreate(db);
} catch (Exception e) {
e.toString();
}
}
}
}
解決 所以它看起來好像他們是無所事事的構造,但搬到一切都變成initialize方法。
Class Store {
public Store() {
db = null;
table = new HashMap<String, String>();
}
public void initialize(Context context) throws SQLException {
if (db == null) {
dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase();
}
}
}
他們這樣做是因爲他們使用一個工廠,如果不存在的話,只會創建存儲的單一實例,但他們無法從工廠的上下文。所以他們所做的就是從其中一個活動中調用初始化方法。所以通過將這些東西移動到構造函數中,並刪除所有的初始化方法。我注意到初始化方法是從多個地方調用的。如果我理解正確,那麼調用getWritableDatabase多少次並不重要,因爲數據庫是單例正確的?
所以我的問題是,即使這可能不是最佳實踐,爲什麼這不起作用?
類商店{ public Store(上下文上下文)dbHelper = new DatabaseHelper(context); db = dbHelper.getWritableDatabase(); }}
雖然沒有得到異常? – user629126
你怎麼知道?你做了我建議的改變並再次運行應用程序? – plowman
好吧,我想我有問題修復。它必須與調用dbhelper的類相關。我稍後會分享這個問題。謝謝 – user629126