我遇到了IndexedDB的问题。我希望在事务中的所有记录之间交换一个唯一索引,但由于违反了记录的唯一约束,事务失败。这对我来说很奇怪,因为在那次交易中我已经重写了被违反的索引。
这是IndexedDB的缺点还是我做错了什么?
以下是一个例子:
开始索引:
[
{
id: 1,
id2: 1
},
{
id: 2,
id2: 2
},
{
id: 3,
id2: 3
},
{
id: 4,
id2: 4
}
]
突变指数:
[
{
id: 1,
id2: 4
},
{
id: 2,
id2: 3
},
{
id: 3,
id2: 2
},
{
id: 4,
id2: 1
}
]
交易将失败,因为id2
上的id
并非唯一,因为id
4已将id2
设置为4。
答案 0 :(得分:2)
唯一性约束适用于每个单独的请求,而不仅仅是在整个事务提交时。所以,例如:
var store = db.createObjectStore('s', {keyPath: id});
store.createIndex('by_idxid', 'idxid', {unique: true});
store.put({id: 1, idxid: 1111});
store.put({id: 2, idxid: 2222});
...
var tx = db.transaction('s', 'readwrite');
var store = tx.objectStore('s');
store.put({id: 1, idxid: 2222}); // this request will fail
store.put({id: 2, idxid: 1111});
您需要先删除记录,例如:
store.delete(2);
store.put({id: 1, idxid: 2222});
store.put({id: 2, idxid: 1111});