ConstraintError:密钥已存在于对象存储中

MD *_*hik 7 javascript indexeddb dexie redux

我正在使用React 16.3.2Redux 4Dexie 2.0.3

当我第二次存储数据时,它会抛出此错误消息。

错误: ConstraintError: Key already exists in the object store.

   return dispatch => {
        db.table
        .add(data)
        .then (function(id){
            console.log(id)
        })
        .catch (function (error) {
            console.log("Error: " + error);
        });
    }
Run Code Online (Sandbox Code Playgroud)

我的数据库架构:

   const db = new Dexie('ReactReduxDexieJsCRUD');
  db.version(1).stores({table:'++id,name,age,bloodGroup,donateBefore,weight' });
Run Code Online (Sandbox Code Playgroud)

第一次它可以很好地存储日期,但之后会出现错误。

Dav*_*der 8

您的架构是什么样的?(db.version(x).stores({...}) 部分?

最常见的是具有入站主键,例如:

db.version(1).stores({
  table: 'id, idx1, idx2...'
});
Run Code Online (Sandbox Code Playgroud)

id是主键。

  • db.table.add({id: 1, foo: 'bar'})将添加 id 为 1 的对象。
  • db.table.add({id: 1, foo: 'bar2'})第二次会失败,因为 id 1 存在。
  • db.table.put({id: 1, foo: 'bar2'})将更新 id 为 1 的对象。

那么你真正想做什么?您说您想使用新密钥添加新对象。如果是这样,我想错误是您第二次给出了相同的密钥。

您还可以让 db 生成 id

db.version(2).stores({
  table: '++id, idx1, idx2...'
});
Run Code Online (Sandbox Code Playgroud)

那么你不需要在调用 add() 时提供 id:

  • db.table.add({foo: 'bar'})将添加 id 为 1 的对象。
  • db.table.add({foo: 'barX'})第二次将添加 id 为 2 的新对象
  • ...