【问题标题】:Batch job - violate constraint temporarily批处理作业 - 暂时违反约束
【发布时间】:2016-10-23 17:17:10
【问题描述】:

让我们考虑一个具有唯一约束和以下值的列:

Col1
1
2
3

现在我想将批处理作业中的这些值更改为:

Col1
2
3
4

结果是,一旦我将 1 更改为 2,这违反了唯一性约束并且批处理作业被停止。虽然,在完成批处理作业后,约束将再次得到满足。

我该如何解决这个问题?

用例

我正在尝试通过contentResolver.applyBatch(MediaStore.AUTHORITY, operations) 重命名媒体存储中的文件列表,这会引发违反约束的异常...

【问题讨论】:

    标签: android sqlite android-contentprovider


    【解决方案1】:

    在重命名元素可能会导致唯一列冲突的情况下,您需要以安全的顺序应用转换。

    基本上不是要求内容提供者执行以下操作

    rename 1 → 2
    rename 2 → 3
    rename 3 → 4
    

    你应该问

    rename 3 → 4
    rename 2 → 3
    rename 1 → 2
    

    始终满足唯一性约束。

    即使没有唯一约束,第一种方法也可能将所有内容重命名为 4

    【讨论】:

    • 事务不应该处理潜在的重命名问题吗?但你是对的,事先对操作进行排序更有意义,解决了所有问题,没有考虑这一点。
    • 不,事务只是一种使更改安全的机制。如果您完成所有操作,事务并不意味着您的列会正常。
    • 我认为事务可能会区分旧值和新值,并且只能在事务提交之前检查旧值。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多