【问题标题】:Where should Android applications call SQLite getWritableDatabase?Android 应用程序应该在哪里调用 SQLite getWritableDatabase?
【发布时间】:2011-06-06 02:50:07
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

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

    否则,我会使用从onCreate 调用的总是很棒的AsyncTask

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        似乎open helper框架的预期用途是在activity启动时打开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();
            }
        
        }
        

        在 onDestroy()... openHelper.close();

        【讨论】:

          猜你喜欢
          • 2014-01-14
          • 2012-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多