【问题标题】:Get id(s) after applying batch operation应用批处理操作后获取 id(s)
【发布时间】:2012-11-02 12:15:06
【问题描述】:

我正在对我的提供者应用一批 ContentProviderOperations:

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

一切都按预期工作,数据被插入到数据库中,但是如果我想提取 id(s),则应该是 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());

【问题讨论】:

    标签: android android-contentprovider bulkinsert android-sqlite


    【解决方案1】:

    在插入的情况下(我猜你在数据库中插入一行),result[i].uri 包含新插入行的 URI,其中 i 是操作数组中相应操作的索引。尝试打印这个 URI,你会看到它是否对应于真实的 id。

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

    更新

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

    更新2

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

    【讨论】:

    • 是的,你是对的,我正在插入,但 uri 只包含基本 uri 和插入数据的表,但在那之后,id 应该出现在哪里,我总是返回 null。但是数据总是正确地插入到表中。
    • 尝试以下代码:ContentUris.parseId(result[i].uri)。它应该返回新插入行的 id。
    • 可悲的是还是同样的问题,现在我得到一个解析异常,因为返回的值仍然是 null 显然 null 不能解析为 long
    • sqlite的插入是否有可能没有按时返回自动递增的id,因此总是返回null(所以这将是一个系统错误)
    • 您确定您的数据库表包含自动递增的_id 值吗?能贴出创建数据库的代码吗?
    猜你喜欢
    • 2014-07-02
    • 2015-10-21
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2018-05-19
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多