我在以前的项目中与 ContentProviders 合作过,这一直对我有用,但是这次我无法解决这个问题。当我使用 Content Resolver 运行 update() 时,它会复制数据库中的对象而不是更新它。
这是触发更新的代码。它仅在 ContentValues 中包含所需的更新数据,而不是对象的完整重复。where语句中的索引变量是对象在数据库中的行号,这个索引是正确的。
ContentValues cv = new ContentValues();
cv.put(MessageProvider.KEY_MESSAGE_STATUS, m.getStatus());
cr.update(MessageProvider.CONTENT_URI_MESSAGE, cv, MessageProvider.KEY_ID + "=" + index, null);
我不相信这段代码有问题,因为我尝试过更改它,但它仍然会产生相同的重复。我的替代方法是在 Uri 中包含行索引。
这是来自内容提供者的代码。
@Override
public int update(Uri uri, ContentValues values, String where,
String[] whereArgs) {
int count = 0;
String whereString;
switch (uriMatcher.match(uri)) {
case MESSAGE:
count = messageDB.update(MESSAGE_TABLE, values, where, whereArgs);
break;
case MESSAGE_ID_:
String segment = uri.getPathSegments().get(1);
if (!TextUtils.isEmpty(where)) {
whereString = " AND (" + where + ')';
} else {
whereString = "";
}
count = messageDB.update(MESSAGE_TABLE, values, KEY_ID + "="
+ segment + whereString, whereArgs);
break;
default: throw new IllegalArgumentException("Unsupported URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
这里没有什么是不正确的,但我相信更多专家的眼睛将能够提供帮助!非常感谢!