【问题标题】:Android - Can SQLite Cursor's be used after closing the database?Android - 关闭数据库后可以使用 SQLite 光标吗?
【发布时间】:2011-12-19 20:42:00
【问题描述】:

首先,如果我错了,请纠正我,但是如果你关闭一个数据库连接,你就不能使用你从中得到的光标,对吗?

db.open();
Cursor c = db.query(true, "MyTable", columns, null, null, null, null, null, null);
db.close();

// The Cursor is empty now because the db was closed...
c.moveToNext();
Log.v(TAG, c.toString(0));

那么关闭数据库后有什么办法可以使用光标吗?有没有办法将它传递到其他地方并像对象一样使用它?还是您必须始终保持数据库连接打开,直到您完成游标?

【问题讨论】:

    标签: java android sqlite android-cursor


    【解决方案1】:

    不,正如下面链接中所说,如果您关闭数据库,则光标将变为无效。

    Will cursor be still alive after database is closed?

    【讨论】:

      【解决方案2】:

      首先,如果我错了,请纠正我,但如果你关闭数据库 连接,你不能使用你从它得到的光标,对吗?

      正确。

      那么关闭数据库后有没有办法使用Cursor呢?

      我不这么认为。当我完成游标时,我总是关闭数据库,即使我将游标传递给另一个游标对象。

      好像有什么方法可以将它传递到其他地方并使用它有点像 对象?

      创建将return cursorobject; 的方法并在需要时使用该方法。 (同时创建完成后关闭数据库的方法)

      或者您是否总是必须让数据库连接保持打开状态,直到您 用光标完成了吗?

      否则光标会出错。

      【讨论】:

        【解决方案3】:

        我使用了cursor.moveToLast(),它允许我在数据库关闭后使用游标进行迭代。我不知道这是不是故意的。

        但是,open helper 框架的预期用途似乎是在活动启动时打开数据库,并在活动被销毁时关闭它。

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

        否则,您将无法使用 android SimpleCursorAdapter 或类似的东西。当然,andriod 文档在这方面非常缺乏。但是,请记住,getWriteableDatabase() 每次都会返回相同的缓存引用,除非您关闭它。所以,如果你不顾一切地关闭那个引用,后台线程等等,那些使用同一个数据库的,将会死。

        【讨论】:

          猜你喜欢
          • 2011-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-10
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多