22

providers パラメーターの後続の ContentProviderOperation 項目が前の項目の結果に依存する同じ操作で、android.content.ContentResolver.applyBatch() メソッドを使用してマスター レコードと詳細レコードをコンテンツ プロバイダーに保存できるかどうか疑問に思っていました。

私が抱えている問題は、 ContentProviderOperation.newInsert(Uri) メソッドが呼び出された時点で実際の Uri が不明であり、Uri が不変であることです。

私が思いついたものを以下に示します。

マスター URI: content://com.foobar.masterdetail/master
詳細 URI: content://com.foobar.masterdetail/master/#/detail

ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
operations.add(ContentProviderOperation.newInsert(intent.getData())
    .withValue(Master.NAME, "")
    .withValue(Master.VALUE, "")
    .build());
operations.add(ContentProviderOperation.newInsert(intent.getData()
        .buildUpon()
        .appendPath("#") /* ACTUAL VALUE NOT KNOWN UNTIL MASTER ROW IS SAVED */
        .appendPath("detail")
        .build())
    .withValue(Detail.MASTER_ID, /* WHAT GOES HERE? */)
    .withValue(Detail.NAME, "")
    .withValue(Detail.VALUE, "")
    .build());
ContentProviderResult[] results = this.getContentResolver().applyBatch(MasterDetail.AUTHORITY, operations);
for (ContentProviderResult result : results) {
    Uri test = result.uri;
}

私のコンテンツ プロバイダーでは、操作をトランザクションにラップするために applyBatch() メソッドをオーバーライドしています。

これは可能ですか、それとももっと良い方法がありますか?

ありがとう。

4

1 に答える 1

17

操作配列内の項目から生成された各結果は、配列内のインデックスによって識別されます。以降の操作では、 withValueBackReference() メソッドを介してこれらの結果を参照できます。

.withValue(Detail.MASTER_ID, /* WHAT GOES HERE? */)

になる

.withValueBackReference(Detail.MASTER_ID, 0)

この使用法の完全な例は、サンプル ContactManagerにあります。0 は、値を取得する ContentProviderOperation のインデックスです。

于 2010-12-28T18:08:21.823 に答える