交换事务中记录之间的索引

时间:2016-07-29 15:14:53

标签: indexeddb

我遇到了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。

1 个答案:

答案 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});