С Dexie следует bulkPut присваивать значения первичного ключа идентичности сохраняемому объекту так же, как это делает put()?

Я использую Dexie для работы с IndexedDB. Я использую:

db.version(1).stores({
    activities: '++LocalActivityId'
});

чтобы PK LocalActivityId автоматически увеличивался/назначался.

Когда я использую put:

db.activities.put(activity).then(function(newId){
    // don't even need to use "newId", the value is already assigned to my object
    console.log("This will have the new LocalActivityId " + activity.LocalActivityId );
});

он присваивает LocalActivityId моему объекту с новым значением из базы данных, но когда я пытаюсь выполнить bulkPut, он этого не делает:

db.activities.bulkPut(activities).then(function (lastKey) {
  console.log("There is nothing here: " + activities[0].LocalActivityId);
});

bulkPut также возвращает только последний новый идентификатор, поэтому у меня нет простого способа получить идентификаторы всех только что вставленных объектов.

Это ожидаемое поведение?

Если это ожидается, что делают люди, пытающиеся выполнить массовую вставку объектов и им нужно знать новые идентификаторы, присвоенные этим объектам?


person chrismay    schedule 19.06.2017    source источник


Ответы (1)


Назначение первичного ключа данному объекту в put() и add() никогда не документировалось и может быть изменено. Я понимаю, что можно было бы ожидать, что bulkPut() будет вести себя так же, но это будет иметь значительные потери производительности, поскольку массовые методы не прослушивают события успеха каждой отдельной операции, а только последнюю. Однако идентификаторы могут быть вычислены, если у всех ваших объектов отсутствуют первичные ключи при добавлении, а первичный ключ таблицы автоматически увеличивается. Если вы поместите смесь, в которой у некоторых установлен первичный ключ, а у некоторых нет, вам придется разделить операцию размещения на два массива: один bulkPut() элементов, у которых есть первичный ключ в своих объектах, а другой (который мог бы в равной степени хорошо быть bulkAdd()), который добавляет элементы, у которых отсутствует первичный ключ. Идентификаторы могут быть вычислены путем вычитания 1 из последнего вставленного идентификатора для каждого предшествующего ему.

person David Fahlander    schedule 19.06.2017