应用批处理操作后获取id

时间:2012-11-02 12:15:06

标签: android android-contentprovider bulkinsert android-sqlite

我在我的提供商处应用了一批ContentProviderOperations:

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

所有内容都按预期工作,数据被插入到数据库中,但如果我想提取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)";

如果我查看表格,我可以看到列_ id 名称,显示的插入数据显示自动增量正常工作。

更新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());

1 个答案:

答案 0 :(得分:2)

如果插入(我猜你在数据库中插入一行),result[i].uri包含新插入行的URI,其中i是操作数组中相应操作的索引。尝试打印此URI,您将看到它是否与真实ID相对应。

如果您的某个操作是UPDATE或DELETE,则相应的结果URI将为null,但result[i].count将包含更新/删除的行数。

<强>更新

我想问题是你在NAME上有一个唯一的索引。也许,你已经插入了一个同名的行?

<强> UPDATE2

问题是ContentProvider中的insert函数没有正确返回id。