0

データベースを開く前に、アセットからSDカードにコピーする大きなSQLiteDatabaseがあります。しかし、そのデータベースを使用するアクティビティは、コピーが完了する前にデータベースにクエリを実行できるため、何かが足りないようです。これにより、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 asyncタスクでそれを実行し、一時変数を介して他のすべての操作を管理する必要があります。非同期タスク

私の推測では、非同期タスクのアセットからデータベースをコピーし、コピーが完了するまでユーザーに警告(トーストまたはポップアップ)するか、ユーザーの操作をブロックします(進行状況ダイアログなど)。

プライベートブール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 に答える