2011-09-03 47 views
0

我一直试图理解并解决过去三天的这个问题。 我有多个ListActivities其中每个查询相同的数据库。在每个活动中,我分别关闭并重新打开onPause()和onResume()中的数据库连接。我填充使用游标该名单适配器我也关闭并重新打开:Android数据库光标寿命

@Override 
public void onPause(){ 
    super.onPause(); 

    if(currentCursor != null){ 
     currentCursor.close(); 
     currentCursor = null; 
    } 

    if(mDbHelper != null){ 
     mDbHelper.close(); 
     mDbHelper = null; 
    } 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    if(mDbHelper == null){ 
     mDbHelper = new DbHelper(this); 
     mDbHelper.open(); 
    } 

    if(currentCursor == null){ 
     new LoadNewListTask().execute(); 
    } 
} 


private class LoadNewListTask extends AsyncTask<String, Void, String> { 
    ProgressDialog dialog; 

    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(context); 
     dialog.setMessage("Loading..."); 
     dialog.show(); 
    } 
    @Override 
    protected String doInBackground(String... arg0) { 
     try{ 
      currentCursor = mDbHelper.fetchNewRows(); 
     }catch(Exception e){} 
     return null; 
    } 
    @Override 
    protected void onPostExecute(String arg){ 
     if(dialog != null && dialog.isShowing()){ 
      dialog.dismiss(); 
     } 
     if(currentCursor != null && currentCursor.getCount()>0){ 
      String[] from = new String[]{DbHelper.KEY_ID, sortingColumn}; 
      int[] to = new int[]{R.id.ai_about_author_btn, R.id.ai_author_name}; 

      MyAlphabetizedAdapter notes = new MyAlphabetizedAdapter(this, R.layout.author_index_item, currentCursor, from, to, sortingColumn); 
      setListAdapter(notes); 
     } 
    } 
} 

在它的工作好第一眼但是当我动作快活动之间有时我会招人烦光标例外一个这样说:

05-01 14:45:05.849: ERROR/AndroidRuntime(1145): 
java.lang.IllegalStateException: attempt to acquire a reference on a 
close SQLiteClosable 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:31) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:56) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1118) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1092) 
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):  at 
apt.tutorial.Restaurant.getAll(Restaurant.java:14) 

和另一个说这(这种情况发生了很多2.1的设备):

09-03 11:30:19.713: INFO/dalvikvm(2541): Uncaught exception thrown by finalizer (will be discarded): 
09-03 11:30:19.713: INFO/dalvikvm(2541): Ljava/lang/IllegalStateException;: Finalizing cursor [email protected] on null that has not been deactivated or closed 
09-03 11:30:19.713: INFO/dalvikvm(2541):  at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596) 
09-03 11:30:19.713: INFO/dalvikvm(2541):  at dalvik.system.NativeStart.run(Native Method) 

更重要的是我ListActivities的一个实现AlphabetIndexer在那里我有传光标。离开活动并使用后退按钮返回后会发生非常奇怪的事情。该列表已填充(如预期),但是当我尝试使用快速滚动时,我在游标上得到了一个空异常,甚至认为我重新创建了它并重新填充了onResume()列表。

对我来说,它看起来像操作系统不能正确处理多个游标,或者我可能会错过这里的东西?

感谢您的帮助。

回答

2

一般来说,我遇到了试图让多个游标保持活动状态的问题。特别是当试图使用托管的光标,我现在试图尽可能避免(加上他们已弃用)。现在,我试图做的是打开游标,用我需要的数据填充对象数组,关闭游标,然后使用ArrayAdapter填充ListView。如果您需要保持游标处于活动状态,并且只需要堆栈中的其他活动正在更改数据,请使用游标管理器,或者更好的是使用新的CursorLoader。执行此操作时,请勿关闭游标,因为您的活动将为您管理游标的生命周期。

+0

我在我的其他项目中使用ArrayAdpters和自定义对象,一切正常。使用游标需要的资源较少,但是我知道它会让所有人都感到沮丧。 – Marqs

+0

是的 - 我一直在那里(很明显,但我仍然没有答案的问题之一)。我有一个活动,我试图同时管理3或4个游标。最后的工作是使用ArrayAdapter方法,除了需要保存的1个游标外(数据会改变)。 – SBerg413

+0

我不认为使用数组而不是光标从内存的角度来看是个好主意 – Raffaele

2

由于您启动了一个异步任务并且您快速离开活动,意味着当任务返回时您将离开此活动,因此onPause()已被调用且游标未关闭。您可以尝试取消onPause()中的异步任务。

+0

你有一个好点,但我等待AsyncTask f完成,然后我转向下一个活动。 – Marqs

+0

嗯,你检查fetchNewRows()是否返回空吗? –

+0

是的,我做了,它返回数据。当我不关闭游标onPause()时,一切都按预期工作,但我们应该不是? SimpleCursorAdapter是否照顾游标的生命周期? – Marqs