Android - 关闭数据库后可以使用 SQLite 光标吗?

Posted

技术标签:

【中文标题】Android - 关闭数据库后可以使用 SQLite 光标吗?【英文标题】:Android - Can SQLite Cursor's be used after closing the database? 【发布时间】: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));

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

【问题讨论】:

【参考方案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() 每次都会返回相同的缓存引用,除非您关闭它。所以,如果你不顾一切地关闭那个引用,后台线程等等,那些使用同一个数据库的,将会死。

【讨论】:

以上是关于Android - 关闭数据库后可以使用 SQLite 光标吗?的主要内容,如果未能解决你的问题,请参考以下文章

sqli-libs bool盲注

任何更改后的 Android Firebase 数据库活动/片段正在关闭

SQL注入之bWAPP之sqli_10-1.php

sqli-labs Less20-Less22

SQLi LABS Less-27a

sqlmap工具的利用