1

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

这里没有什么是不正确的,但我相信更多专家的眼睛将能够提供帮助!非常感谢!

4

2 回答 2

1

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

在深入研究代码并调试之后,代码似乎很好,正如我已经说过的那样,我是这么认为的。结果证明这个问题与内容提供者无关,这是服务器后端的错误,包括响应应用程序的错误数据。

感谢您发布想法。我的经验教训:在找到解决方案之前不要离开调试器,即使确实需要几天时间......

于 2012-08-15T22:19:51.187 回答
1

我想到的事情是。

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

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

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

于 2012-08-15T14:44:51.090 回答