Android应用程序应该在哪里调用SQLite getWritableDatabase?

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29上的文档指出:

数据库升级可能需要很长时间,您不应该从应用程序主线程调用此方法[getWritableDatabase],包括来自ContentProvider.onCreate()。

这引出了一个问题:为了获得最佳实践,应该从哪里调用getWritableDatabase?

我的感觉是,也许应该在应用程序启动时调用一次,并使用回调将数据库标记为就绪。 它是否正确?

对于小型和敏捷的数据库,我想这不是一个问题。

否则,我会使用从onCreate调用的始终精彩的AsyncTask

它可以从任何地方调用,但不应该从UI线程调用它,因为您不知道该过程需要多长时间(特别是在使用不同的文件系统时)。 即使你知道数据库应该很小,你也不知道文件系统(它一次可以执行多个作业吗?是否已有数千个其他作业在排队等待?)。 您可以使用AsyncTaskThread来调用getWriteableDatabase。

似乎open helper框架的预期用途是在活动开始时打开db,并在Activity被销毁时关闭它。

在onCreate()中的AsyncTask中……

 new StartupTask().execute(); 

下面的AsyncTask Thread.sleep()只是给出足够的时间来显示对话框,以便您可以看到它的工作原理。 当你完成比赛时显然要把它拿掉。 ;)

 private class StartupTask extends AsyncTask { private ProgressDialog progressDialog; @Override protected Object doInBackground(final Object... objects) { openHelperRef.getWritableDatabase(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onPreExecute() { super.onPreExecute(); runOnUiThread(new Runnable() { public void run() { progressDialog = ProgressDialog.show( MyActivity.this, "Title", "Opening/Upgrading the database, please wait", true); } }); } @Override protected void onPostExecute(Object object) { super.onPostExecute(object); progressDialog.dismiss(); } } 

in onDestroy()… openHelper.close();