2

プロバイダーに ContentProviderOperations のバッチを適用しています。

ContentProviderResult[] result = resolver.applyBatch(...)

すべてが期待どおりに機能し、データが DB に挿入されますが、id を抽出する場合、id である必要がある uri の最後の要素は常に null です。

これは、テーブルの _id を自動インクリメントに設定したために発生していますか (つまり、ID を自動インクリメントせず、コードから手動で uid を入力すると機能します)。

そうでない場合は、この動作の原因を教えてください。

更新:これは、テーブルを作成するための文字列です:

    private static final String CREATE_TABLE_WORKFLOWSTATES =
        "CREATE TABLE " + Tables.WORKFLOWSTATES + " (" 
        + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
        + WorkflowStatesColumns.NAME + " TEXT NOT NULL,"
        + "UNIQUE ("+ WorkflowStatesColumns.NAME + ") ON CONFLICT IGNORE)";

テーブルを表示すると、列 _ idnameが表示され、挿入されたデータが表示され、自動インクリメントが適切に機能していることがわかります。

更新 2:これは私が ContentProviderOperation を構築した方法です:

これは、ContentProviderOperations を使用した ArrayList です (CollectionUtils は、Arraylist をインスタンス化するためのカスタム クラスです)。

ArrayList<ContentProviderOperation> batch = CollectionUtils.newArrayList();

これが実際の操作です。

batch.add(ContentProviderOperation
    .newInsert(InvoiceContract.addCallerIsSyncAdapterParameter(WorkflowStates.CONTENT_URI))
    .withValue(WorkflowStates.NAME, task.getWFS()).build());
4

1 に答える 1

2

挿入の場合(そしてデータベースに行を挿入すると思いますが)、にresult[i].uriは新しく挿入された行のURIが含まれます。ここで、iは操作配列内の対応する操作のインデックスです。このURIを印刷してみると、実際のIDに対応しているかどうかがわかります。

操作の1つがUPDATEまたはDELETEの場合、対応する結果URIはnullになりますがresult[i].count、更新/削除された行の数が含まれます。

アップデート

問題は、NAMEに一意のインデックスがあることだと思います。たぶん、あなたはすでに同じ名前で挿入された行を持っていますか?

UPDATE2

問題は、ContentProviderの挿入関数がIDを正しく返さなかったことです。

于 2012-11-02T14:45:04.483 に答える