Получить ключ добавленной записи в IndexedDB

У меня есть этот код в IndexedDB:

var request = objectStore.add({ entryType: entryType, entryDate: t});

Теперь я хочу узнать ключ этой только что добавленной записи. Как мне это сделать?

Я нашел эту статью и этот код:

var data = {"bookName" : "Name", "price" : 100, "rating":"good"};
var request = objectStore.add(data);
request.onsuccess = function(event){
    document.write("Saved with id ", event.result)
    var key = event.result;
};

У меня это не работает - ключ отображается как неопределенный. Я думаю, что мне не хватает чего-то основного здесь!


person Stacked Flow    schedule 28.12.2012    source источник
comment
Я думаю, что есть некоторая документация для IndexedDB - там нет информации об этом?   -  person halfer    schedule 28.12.2012
comment
Я не мог найти его - есть идеи?   -  person Stacked Flow    schedule 28.12.2012


Ответы (4)


Пройдите этот код

var data = {"bookName" : "Name", "price" : 100, "rating":"good"};
var request = objectStore.add(data);
request.onsuccess = function(event){
    document.write("Saved with id ", event.result)
    var key = event.target.result;
};

Надеюсь, этот код будет работать для получения ключа последней вставленной записи.

person Vikram    schedule 12.06.2014

спецификация написана для агента пользователя, а не для разработчика. Так что это сбивает с толку. Генератор ключей предоставляется пользовательским агентом.

Любой объект event, полученный обработчиком onsuccess, всегда имеет event.target.result. Это ключ, который вы ищете. Ключ генерируется автоматически, если вы его не предоставляете, при условии, что вы установили для параметра autoIncrement значение true.

Это задокументировано на шаге 8: следующим образом:

  1. Результат этого алгоритма является ключевым.
person Kyaw Tun    schedule 29.12.2012

Хитрость здесь заключается в том, чтобы уметь выполнять поиск по фразам итеративно, пока вы не найдете то, что вам нужно. Я никогда раньше не слышал об IndexedDB, но, похоже, нашел то, что вам нужно.

Я ввел "IndexedDB" в поисковую систему и нашел это. Получилась фраза "генератор ключей", поэтому я искал и ее, которая привел меня к этому и это.

Ссылка StackOverflow обсуждает использование UUID, которые, конечно, могут быть сгенерированы в JavaScript, а в последней ссылке есть примеры того, что вы хотите делать из коробки.

person halfer    schedule 29.12.2012

Если вы используете оболочку idb Promise для IndexedDB, то новый ключ — это просто возвращаемое значение из вызова add():

import { openDB } from 'idb';

const db = await openDB(...);
const tx = db.transaction('mystore', 'readwrite');
const newId = await tx.store.add({ hello: 'world' });
await tx.done;

console.log(`Autogenerated unique key for new object is ${newId}`);

Помните, конечно, что это будет работать только в том случае, если вы включите autoIncrement: true в параметры, переданные createObjectStore().

person Malvineous    schedule 24.04.2021