每次手机重新启动时都会调用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