我一直試圖理解並解決過去三天的這個問題。 我有多個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()列表。
對我來說,它看起來像操作系統不能正確處理多個遊標,或者我可能會錯過這裏的東西?
感謝您的幫助。
我在我的其他項目中使用ArrayAdpters和自定義對象,一切正常。使用遊標需要的資源較少,但是我知道它會讓所有人都感到沮喪。 – Marqs
是的 - 我一直在那裏(很明顯,但我仍然沒有答案的問題之一)。我有一個活動,我試圖同時管理3或4個遊標。最後的工作是使用ArrayAdapter方法,除了需要保存的1個遊標外(數據會改變)。 – SBerg413
我不認爲使用數組而不是光標從內存的角度來看是個好主意 – Raffaele