1

私は sqlite データベースを開く非同期クラスを持っています。データベースを初めて実行する場合、完了するまでに約 10 秒かかるデータが入力されます。バックグラウンドでまだ作業が行われていますが、非同期タスクはすぐに終了します。おそらく別の非同期タスクまたは何かを実行しているsqliteのoncreateメソッドと関係があると思います

class BuildDatabase extends AsyncTask<Void, Void, Void> {

    ProgressDialog loading;

    @Override
    protected void onPreExecute() {
        loading = ProgressDialog.show(ctx, "Please wait...", "Building database, this may take a few seconds", true);
    }

    @Override
    protected Void doInBackground(Void... params) {
        // open up the database, if its the first time running the data will
        // be populated
        db = new SQLiteWrapper(ctx); //takes 1-10 seconds
        return null;

    }

    @Override
    protected void onPostExecute(Void result) {
        Log.d(TAG,"post execute");
        loading.dismiss();
    }
}

sqlite ヘルパー クラスのメイン メソッドは次のようになります。

public class SQLiteWrapper extends SQLiteOpenHelper {
public SQLiteWrapper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    ctx = context;

}

@SuppressWarnings("deprecation")
@Override
public void onCreate(SQLiteDatabase database) {
    database.execSQL(DATABASE_CREATE);

    // populate our database with data from the zones file
    try {
        database.setLockingEnabled(false);
        buildDatabase(database);
    }
    finally {
        database.setLockingEnabled(true);
    }

}
}

このクラスに精通している場合は、 onCreate が呼び出されるだけで、データベースは存在しません。データベース コンストラクター内で onCreate() を手動で呼び出すと、進行状況ダイアログが表示されます。考え?

4

1 に答える 1

0

onCreate実際にデータベースを開いた場合 (まだ存在していない場合)にのみ呼び出されます。

this.getWritebleDatabase()次のように、SQLiteWrapperコンストラクターに追加します。

public SQLiteWrapper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    ctx = context;
    this.getWritableDatabase();
}
于 2013-09-11T05:40:52.777 に答える