每次手机重启时都会调用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实例,如果它不存在,但他们无法从工厂获得上下文。所以他们所做的就是从其中一个活动中调用initialize方法。因此,通过将这些内容移动到构造函数中并删除初始化方法,一切正常。我注意到,初始化方法是从多个地方调用的。如果我理解正确,那么调用getWritableDatabase的次数并不重要,因为数据库是单个正确的吗?
所以我的问题是,即使这可能不是最好的做法,为什么这不起作用?
Class Store { 公共存储(上下文上下文){ dbHelper = new DatabaseHelper(context); db = dbHelper.getWritableDatabase(); } }
答案 0 :(得分:0)
改变这个:
} catch (Exception e) {
e.toString();
}
对此:
} catch (Exception e) {
logger.error("Unable to upgrade database", e);
}
打印的堆栈跟踪应该可以解释您的问题。如果没有,请在此处发布,我们将会看一看。 : - )