我已实施update()
ContentProvider
并使用getContext().getContentResolver().notifyChange(uri, null);
我显而易见的是,每当只有一行受影响时,我想通过行特定的uri通知,但无法找到方法。
像"select id where selectionArgs"
这样的附加查询可以做到这一点,但这将是一种愚蠢的方式。
onchange(boolean, uri)
获取完整的uri而不是特定的行,很容易理解这是因为ContentProvider.update()
正在发送相同的行。
some code for more clarity
MyContentProvider的update()方法
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Log.d("TAG", "update " + uri.getPath());
int count = 0;
switch (uriMatcher.match(uri)) {
case BOOKS:
count = booksDB.update(DATABASE_TABLE, values, selection, selectionArgs);
break;
case BOOK_ID:
count = booksDB.update(DATABASE_TABLE, values,
_ID + " = " + uri.getPathSegments().get(1)
+ (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""),
selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (count == 1) {
Cursor c = query(uri, new String[] { _ID }, selection, selectionArgs, null);
long rowId = Long.valueOf(c.getString(c.getColumnIndex(_ID)));
uri = ContentUris.withAppendedId(CONTENT_URI, rowId);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
我会更新表格
getContentResolver().update(MyContentProvider.CONTENT_URI, values1, MyContentProvider._ID+"<?", new String[]{"3"}));
坦率地说,代码几乎与问题无关,只是试图给你一些背景
答案 0 :(得分:8)
在您的提供者方法中,只需返回附加了id
的uri@Override
public Uri insert(Uri uri, ContentValues values) {
Log.i(TAG, "insert " + uri);
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final int match = URI_MATCHER.match(uri);
Uri returnUri;
switch (match) {
case MESSAGE: {
long _id = db.insert(MessageContract.MessageEntry.TABLE_NAME, null, values);
if (_id > 0)
returnUri = ContentUris.withAppendedId(MessageContract.MessageEntry.CONTENT_URI, _id);
else
throw new android.database.SQLException("Failed to insert row into " + uri);
break;
}
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
getContext().getContentResolver().notifyChange(returnUri, null);
return returnUri;
}
并为后代注册你的观察者。
getContentResolver().registerContentObserver(MessageContract.MessageEntry.CONTENT_URI, true, mContentObserver);
要从Uri获取ID,您可以使用ContentUris.parseId(uri)
答案 1 :(得分:1)
不幸的是我无法建议简单的解决方案(因为我不知道您需要运行的完整代码和更新),我们可以尝试一些方法(其中一些我已经在我的应用程序中实现) :
ContentValues
中提供ID - 这种方式看起来不适用于您的情况,并且需要循环调用notifyChange()
; Uri
(只有一些特定的应用在选择时需要多种不同的查询,通常在Uri
中包含查询参数要容易得多)。在程序的另一部分获得具有该特定Uri
的通知之后,它将能够检查它的“当前项目”是否已更新并且是否适当地行动(例如,最简单的案例列表和一篇文章在单独的活动中打开;然后您从服务器更新后台文章列表您可能还需要更新当前打开的文章,因此,需要知道它是否已更新)。您应该能够使用刚收到的Uri
检查观察者一侧的特定项目,因为它(Uri)将包含您用于查询的参数; 答案 2 :(得分:0)
您可以通过ContentValues传递ID,并将其附加到通知网址。这样您就不必进行单独的查询。
@Override
public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int rows = _database.update(getTableName(), values, selection, selectionArgs);
if (rows > 0) {
Uri itemUri = ContentUris.withAppendedId(uri, values.getAsLong(DatabaseModel.COLUMN_ID)); // DatabaseModel.COLUMN_ID is "_id"
getContext().getContentResolver().notifyChange(itemUri, null);
}
return rows;
}