请帮助我了解这里发生的事情。
我在标签中有两个片段(A和B),通过Sqlite数据库中的CursorLoader和aContentProvider从不同的表中读取数据。使用不同的URI,我可以更改ContentProvider正在查询的表。
我在标签A和B之间切换时按预期工作,除非我切换到B,旋转并切换回A,否则返回错误的光标。返回片段B的光标而不是片段A的光标,使片段A中的listView导致崩溃。在某种程度上,光标似乎在旋转时重复使用。
为什么会发生这种情况?如何防止返回错误的光标?
这就是我在片段A和B中都有的。试图让装载机ID没有成功。
public void onResume() {
super.onResume();
getLoaderManager().restartLoader(mLoaderId, null, this);
}
我的ContentProvider看起来像这样:
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
Cursor cursor = null;
switch (uriMatcher.match(uri)) {
case ALL_NEWS:
queryBuilder.setTables(NewsDb.SQLITE_TABLE);
cursor = queryBuilder.query(db, projection, selection,
selectionArgs, null, null, sortOrder);
break;
case SINGLE_PLACE:
queryBuilder.setTables(PlacesDb.SQLITE_TABLE);
String id = uri.getPathSegments().get(1);
queryBuilder.appendWhere(PlacesDb.KEY_ID + "=" + id);
cursor = queryBuilder.query(db, projection, selection,
selectionArgs, null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
return cursor;
}
答案 0 :(得分:1)
使用CursorLoader
时,会自动观察到数据更改,因此您绝对应该删除restartLoader
中的onResume()
来电。如果实施得当,您只需拨打initLoader
的{{1}}中的onActivityCreated
。
Fragment
ID仅限于LoaderManager
,因此您应该使用Fragment
ID。如果在static constant
中自己处理了Loaders
,那么每个Fragments
都可以拥有相同的Fragment
ID(即使他们是'由同一个Loader
管理。
所以每个Activity
:
Fragment