2011-11-01 98 views
14

首先,纠正我,如果我错了,但如果关闭数据库连接,你不能使用它从你得到的光标,是吗?Android - 关闭数据库后可以使用SQLite Cursor吗?

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

那么在关闭数据库后有没有办法使用Cursor?有什么方法可以将它传递到其他地方,并使用它有点像一个对象?或者你总是不得不打开数据库连接,直到完成游标?

回答

3

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

正确。

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

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

像有什么方法可以将它传递到别处,并使用它有点像一个 对象?

创建方法将return cursorobject;并在任何需要它的地方使用该方法。 (请在完成后还可以创建方法,将关闭DB)

或者你总是要离开的数据库连接打开,直到您 与光标做了什么?

否则,光标会旋上。

0

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

但是,似乎打开帮助程序框架的打算用途是在活动开始时打开数据库,并在活动被销毁时关闭它。

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

否则,你将无法使用android SimpleCursorAdapter或类似的东西。当然,安德里奥特文件在这方面非常缺乏。但是,请记住,除非关闭了getWriteableDatabase(),否则每次都会返回相同的缓存引用。所以,如果你无条件地关闭该引用,后台线程以及不在使用同一个数据库的内容将会死亡。

相关问题