方向改变的片段,内容提供者和游标

时间:2013-11-24 20:59:35

标签: android android-contentprovider android-orientation android-cursorloader

请帮助我了解这里发生的事情。

我在标签中有两个片段(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;

}

1 个答案:

答案 0 :(得分:1)

使用CursorLoader时,会自动观察到数据更改,因此您绝对应该删除restartLoader中的onResume()来电。如果实施得当,您只需拨打initLoader的{​​{1}}中的onActivityCreated

Fragment ID仅限于LoaderManager,因此您应该使用Fragment ID。如果在static constant中自己处理了Loaders ,那么每个Fragments都可以拥有相同的Fragment ID(即使他们是'由同一个Loader管理。

所以每个Activity

Fragment