【发布时间】:2011-07-01 02:21:12
【问题描述】:
每次手机重启时都会调用 onUpgrade 方法,我可以看到 onUpgrade 中的 oldVersion 参数永远不会被调用。我曾尝试卸载该应用程序,但没有成功。奇怪的是oldVersion总是6。或者每次手机重启时我的数据库都消失了还有其他原因吗?
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();
}
}
}
}
已解决 所以看起来他们在构造函数中什么也没做,而是把所有东西都移到了一个初始化方法中。
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();
}
}
}
他们这样做是因为他们使用了一个工厂,如果它不存在,它只会创建一个 Store 实例,但他们无法从工厂获取上下文。所以他们所做的就是从其中一项活动中调用初始化方法。因此,通过将这些东西移入构造函数并删除初始化方法,一切正常。我注意到从不止一个地方调用了初始化方法。如果我理解正确,调用 getWritableDatabase 多少次都没关系,因为数据库是单例正确的?
所以我的问题是,即使这可能不是最佳做法,为什么这不起作用?
类商店{ 公共商店(上下文上下文){ dbHelper = 新数据库助手(上下文); db = dbHelper.getWritableDatabase(); } }
【问题讨论】:
标签: android