gpt4 book ai didi

java - CursorLoader 通知数据变化

转载 作者:行者123 更新时间:2023-11-29 21:00:01 26 4
gpt4 key购买 nike

我已经实现了我的自定义 ContentProvider,它有几个 URI:

主要的:

//Return all items, uriType = ALLITEMS
String BASEURI = "content://authority/items"

//Return all items in category #, uriType = ITEMS
"content://authority/items/cat/#"
//Return all items in category # starting with *, uriType = ITEMS_INITIAL
"content://authority/items/cat/#/*"

我的 Activity 实现了这些 Loader 回调:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
CursorLoader mCursorLoader = null;
switch (id) {
case 0:
mCursorLoader = new CursorLoader(
mActivity,
Uri.parse("content://authority/items/cat/"
+mCurrentID), mColumns, null, null, null);
break;
}
return mCursorLoader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
switch (loader.getId()) {
case 0:
cursor.setNotificationUri(getContentResolver(),MyContentProvider.BASEURI);
if (null == mAdapter)
mAdapter = new GridViewCursorAdapter(this, cursor,0);
//gv is a GridView
if (gv.getAdapter() != mAdapter)
gv.setAdapter(mAdapter);
if (mAdapter.getCursor() != cursor)
mAdapter.swapCursor(cursor);
break;
}
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
mAdapter.swapCursor(null);
}

当我想插入我使用的数据时:

for (ItemClass item : itemsToInsert) {
getContentResolver().insert(MyContentProvider.BASEURI, itemToContentValues(item));
}

最后 MyContentProvider 中的 insert 方法是这样定义的:

@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase database = db.getWritableDatabase();
int turiType = sURIMatcher.match(uri);
long id = 0;
switch (uriType) {
case ALLITEMS:
id = database.insert(MySQLiteHelper.TABLE_ITEMS, null, values);
break;
default:
throw new IllegalArgumentException("Unknown URI (" + uri + ")");
}
getContext().getContentResolver().notifyChange(uri, null);
return null;//I will implement uri path to single item later
}

如您所见,用于初始化 Loader 的默认 URI 是按类别 ID 筛选的,而不是 BASEURI 筛选器,但我使用了 Cursor。 setNotificationUri 将通知 URI 设置为 BASEURI,但我的 GridView 的内容没有更新。

如果我重新启动 Activity,我可以看到插入的数据,所以只是通知不起作用。我应该更改什么才能正确通知加载程序?

最佳答案

ContentProvider(和任何数据库)中进行过滤的最佳方法是使用 where 语句。在这种情况下,这意味着您的 CursorLoader 看起来像这样:

mCursorLoader = new CursorLoader(
mActivity,
MyContentProvider.BASEURI,
mColumns,
MyContentProviderColumns.CATEGORY + "=?", // category = ?
new String[] { Integer.toString(mCurrentID) }, // pass in your category
null);

传递选择,过滤任何你的类别列,选择参数是类别值本身。在这种情况下,您只有一个 URI,因此更改通知更易于管理。

如果您真的非常需要单独的 URI,另一种选择是在您的 insert 语句中执行多个 notify 调用:

getContext().getContentResolver().notifyChange(uri, null);

int category = extractCategoryFromContentValues(values);
getContext().getContentResolver().notifyChange("content://authority/items/cat/"
+ category, null);

关于java - CursorLoader 通知数据变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26404047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com