Android ContentResolver.update()生成重复项

时间:2012-08-13 14:15:04

标签: java android android-contentprovider

我曾在之前的项目中与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;
}

在这里没有任何事情因为不正确而跳出来,但我确信更专业的眼睛能够提供帮助!非常感谢!

2 个答案:

答案 0 :(得分:1)

最重要的是。

您是否验证了where子句是否正确并且它指向实际存在的记录。

当你有一个实际上不存在的where子句时,messageDB.update如何处理?

我自己没有与ContentProviders合作过。但这似乎是一个可能的错误来源。

答案 1 :(得分:1)

感谢您的回复,非常感谢!

在深入研究代码并进行调试后,看起来代码很好,正如我已经说过的那样。事实证明,问题与内容提供商没什么关系,服务器后端的错误包括对应用程序的响应中的错误数据。

感谢发帖。经验教训:在你有解决方案之前不要离开调试器,即使它需要几天......