我正在我的提供程序上应用一批 ContentProviderOperations:
ContentProviderResult[] result = resolver.applyBatch(...)
一切都按预期工作,数据被插入到数据库中,但如果我想提取 id,则 uri 的最后一个元素(应该是 id)始终为 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和name,插入的可见数据表明自动增量工作正常。
更新 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());
最佳答案
在插入的情况下(我猜您在数据库中插入了一行),result[i].uri
包含新插入行的 URI,其中 i 是该行的索引操作数组中的相应操作。尝试打印这个 URI,您将看到它是否对应于真实的 id。
如果您的操作之一是 UPDATE 或 DELETE,则相应的结果 URI 将为 null,但 result[i].count
将包含更新/删除的行数。
更新
我猜问题是你在 NAME 上有一个唯一的索引。也许,您已经插入了同名的行?
更新2
问题是ContentProvider中的插入函数没有正确返回id。
关于android - 应用批量操作后获取id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13195057/