我希望在升级数据库时显示对话框。 现在我尝试创建AsyncTask并将升级逻辑放在' doInBackground'上。 并且,用于预先执行'和' postExecute' to showDialog。
这似乎很好。 但是,它有严重的问题。当用户强制关闭应用程序(使用任务杀手或任务管理器)时,android系统误解了每项工作都做得很好。
看看这个流程
[好工作]
databaseVersion = 1;
执行onUpgrade()
执行AsyncTask。
onPreExecute(),showProgressDialog。
doInBackground(),迁移数据库。
onPostExecute(),dismissProgressDialog。
databaseVersion = 2;
[糟糕的工作]
databaseVersion = 1;
执行onUpgrade()
执行AsyncTask。
onPreExecute(),showProgressDialog。
doInBackground(),迁移数据库。
强制停止申请(使用任务杀手或任务管理员)
databaseVersion = 2;
数据库迁移未完全执行,但databaseVersion为2 !!
我该如何解决这个问题?
答案 0 :(得分:1)
数据库升级时,调用'onUpgrade()'。 并且所有事情都做得很好,'db.setVersion(newVersion);'被称为。
下面的代码是'SQLiteOpenHelper.getDatabaseLocked(boolean writable)'
db.beginTransaction();
try {
if (version == 0) {
onCreate(db);
} else {
if (version > mNewVersion) {
onDowngrade(db, version, mNewVersion);
} else {
onUpgrade(db, version, mNewVersion);
}
}
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
因此,当升级是中断时,数据库版本不会设置为新版本。