2016-10-23 19 views
0

のがユニーク制約と、次の値を持つ列を考えよう制約に違反:バッチジョブ - 一時的

Col1 
1 
2 
3 

は今、私は次のようにバッチジョブでこれらの値を変更したい:

Col1 
2 
3 
4 

結果は、1から2に変更するとすぐに、これが一意の制約に違反し、バッチ・ジョブが停止されます。バッチジョブを終了した後、再び制約が満たされます。

どのように問題を解決できますか?

ユースケース

私はcontentResolver.applyBatch(MediaStore.AUTHORITY, operations)を経由してメディアストア内のファイルのリストの名前を変更しようとしていると、これは制約違反の例外がスローされます...名前変更要素が発生する可能性がありますこのような場合には

答えて

1

ユニークな列の衝突を避けるには、変換を安全な順序で適用する必要があります。

基本的にはなく、あなたは常に一意制約を満たす

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

を尋ねるべき次の操作

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

を実行するために、コンテンツプロバイダを尋ねます。トランザクションは、潜在的な名前変更の問題の世話をするべきではありません

はまたしてもユニークな制約なしに、第一の方法は、潜在的に4

+0

にすべての名前を変更するのでしょうか?しかし、あなたが正しい、それは事前に操作を並べ替えることがより合理的です、それはすべての問題を解決する、それについて考えなかった。 – prom85

+0

いいえ、トランザクションは変更を安全にするためのメカニズムに過ぎません。トランザクションは、すべての操作の最後に行くと列が正常になることを知ることは意味がありません。 – XGouchet

+0

私は、トランザクションが古い値と新しい値との間にdistingiushする可能性があり、トランザクションがコミットされるまでのみ古い値をチェックできると考えました。助けてくれてありがと – prom85

関連する問題