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 helper 类的主要方法如下所示

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 回答