1

私は以前のプロジェクトで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;
}

間違っているとしてここで私に飛び出すものは何もありませんが、より専門家の目が助けることができると確信しています!どうもありがとう!

4

2 に答える 2

1

ご回答ありがとうございました!

コードを深く掘り下げてデバッグした後、私がすでに言ったように、コードは問題ないように見えます。問題はコンテンツプロバイダーとは何の関係もないことが判明しました。アプリケーションへの応答に誤ったデータが含まれるサーバーバックエンドのエラーでした。

アイデアを投稿していただきありがとうございます。私のために学んだ教訓:たとえそれが数日かかるとしても、解決策が得られるまでデバッガーを離れないでください...

于 2012-08-15T22:19:51.187 に答える
1

私の頭に浮かぶのはそうです。

where句が正しく、実際に存在するレコードを指していることを確認しましたか。

また、実際には存在しないwhere句がある場合、messageDB.updateはどのように処理しますか?

自分でContentProvidersを使用したことはありません。しかし、それはエラーの原因となる可能性があります。

于 2012-08-15T14:44:51.090 に答える