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

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29中的文档声明:

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

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

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

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

否则,我会使用从onCreate调用的永远美好的AsyncTask

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

看来打开帮助程序框架的打算使用,是打开活动启动数据库,并closures它时,活动被破坏。

在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(); } } 

在onDestroy()… openHelper.close();