0

我有一个大型 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");
            }
        }
    }

我想你明白了。但是,我的问题是如何在打开数据库之前检查数据库是否已完成复制?显然我现在做得不对。

问候,乔纳斯

4

1 回答 1

2

如果某些操作很长,您应该在 asn 异步任务中执行此操作,并通过临时变量管理所有其他操作。异步任务

我的建议是从异步任务中的资产复制数据库并警告用户(toast 或弹出窗口)或阻止用户交互(例如,使用进度对话框),直到复制完成。

private boolean isCopyingDb = true 在 onCreate()

 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阻止用户..或实现一个进度条,这样用户就知道他应该等待多长时间。

于 2013-01-27T11:52:06.337 回答