我有一个大的SQLiteDatabase,在打开该数据库之前我会从Assets复制到SDCard。但我似乎遗漏了一些东西,因为使用该数据库的Activity可以在复制完成之前查询数据库,这会导致SQLiteException。
在我的构造函数中,我这样做:
private DataBaseHelper(Context context) {
super(context, DB_NAME, null, 1);
mContext = context;
DB_FILE_PATH = context.getExternalFilesDir(null);
try {
createDataBase();
openDataBase();
} catch (IOException e) {
e.printStackTrace();
}
}
createDatabase方法正在执行:
public void createDataBase() throws IOException {
dbExist = checkDataBase();
if (dbExist) {
} else {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
我想你明白了。但是,我的问题和问题是如何在打开数据库之前检查数据库是否已完成复制?显然我现在没有正确地做到这一点。
此致 纳斯
答案 0 :(得分:2)
如果某些操作很长,您应该在asn异步任务中执行此操作,并通过临时变量管理所有其他操作。 Async task
我的想法是从异步任务中的资产中复制数据库并警告用户(吐司或弹出窗口)或阻止用户交互(例如,使用进度对话框),直到复制完成。
在onCreate()中,private boolean isCopyingDb = true
private class Copy Db extends AsyncTask<Void, Integer, Long> {
protected Long doInBackground(Void... ) {
isCopyingDb = true;
//copy db
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
isCopyingDb = false;
pdia.dismiss();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pdia = new ProgressDialog(this);
pdia.setMessage("Doing background..");
pdia.show();
}
}
在您的活动中检查isCopyingDb的状态。如果为false,请使用db。
修改强> 使用简单的progressDialog阻止用户..或实现进度条,以便用户知道他应该等待多长时间。