我曾在之前的项目中与ContentProviders合作过,这对我来说一直很有用,但这次我无法理解这个问题。当我使用内容解析器运行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;
}
在这里没有任何事情因为不正确而跳出来,但我确信更专业的眼睛能够提供帮助!非常感谢!
答案 0 :(得分:1)
最重要的是。
您是否验证了where子句是否正确并且它指向实际存在的记录。
当你有一个实际上不存在的where子句时,messageDB.update如何处理?
我自己没有与ContentProviders合作过。但这似乎是一个可能的错误来源。
答案 1 :(得分:1)
感谢您的回复,非常感谢!
在深入研究代码并进行调试后,看起来代码很好,正如我已经说过的那样。事实证明,问题与内容提供商没什么关系,服务器后端的错误包括对应用程序的响应中的错误数据。
感谢发帖。经验教训:在你有解决方案之前不要离开调试器,即使它需要几天......