ConstraintError: ключ уже существует в хранилище объектов - PullRequest
0 голосов
/ 17 мая 2018

Я работаю с Реакт 16.3.2 , Redux 4 и Dexie 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);
        });
    }

Моя схема БД:

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

В первый раз он хорошо сохраняет дату, но после выдает ошибку.

1 Ответ

0 голосов
/ 18 мая 2018

Как выглядит ваша схема? (часть db.version (x) .stores ({...})?

Наиболее распространенным является наличие входящего первичного ключа, например:

db.version(1).stores({
  table: 'id, idx1, idx2...'
});

Здесь id - это первичный ключ.

  • db.table.add({id: 1, foo: 'bar'}) добавит объект с идентификатором 1.
  • db.table.add({id: 1, foo: 'bar2'}) Второй раз не удастся, потому что существует идентификатор 1.
  • db.table.put({id: 1, foo: 'bar2'}) обновит объект с идентификатором 1.

Так что вы действительно хотите сделать? Вы говорите, что хотите добавить новый объект с новым ключом. Если это так, я полагаю, ошибка в том, что вы даете тот же ключ во второй раз.

Вы также можете позволить идентификатору быть сгенерированным db

db.version(2).stores({
  table: '++id, idx1, idx2...'
});

Тогда вам не нужно указывать идентификатор в вызовах add ():

  • db.table.add({foo: 'bar'}) добавит объект с идентификатором 1.
  • db.table.add({foo: 'barX'}) 2-й раз добавит новый объект с идентификатором 2
  • ...
...