2011-01-09 49 views
9

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29状态的文档:Android应用程序应该在哪里调用SQLite getWritableDatabase?

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

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

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

回答

4

对于小型和敏捷数据库,我想这不是什么大问题。

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

2

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

0

看来,打开帮助器框架的打算用途是打开活动启动数据库,并在活动销毁时关闭它。

在从的AsyncTask内的onCreate()...

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

相关问题