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 光标吗?的主要内容,如果未能解决你的问题,请参考以下文章