Я пытаюсь обмотать голову вокруг IndexedDB.IndexedDB: Изменение ранее существовавших объектов в хранилище объектов
Я создал хранилище объектов, которое использует key-generator без ключа.
var objectStore = db.createObjectStore("domains", {autoIncrement: true });
objectStore.createIndex("domain", "domain", { unique: true, multiEntry: true });
Для того, чтобы получить доступ моих записей, я создал index, который ссылается на мой объект магазина. Путь к ключу индекса - свойство domain
моих записей.
Вот пример того, что одна запись в моем хранилище объектов может выглядеть следующим образом:
{ domain: ["stackexchange",
"stackoverflow",
"superuser",
"askubuntu",
"serverfault"],
bold : ["<strong>",1],
italic : ["<em>",1],
strikethrough : ["<del>",1],
superscript : ["<sup>",1],
subscript : ["<sub>",1],
heading1 : ["<h1>",1],
heading2 : ["<h2>",1],
heading3 : ["<h3>",1],
blockquote : ["<blockquote>",1],
code : ["<code>",1],
newline : ["<br>",2],
horizontal : ["<hr>",2]
},
Каждая запись появляется в domain
собственности гарантированно быть уникальным среди множества, состоящего из объединения каждый домен ключа значение из каждой записи моего хранилища объектов. И.Е. Вы не найдете ни одного из этих доменов нигде в моем хранилище объектов.
Мне нужно, чтобы пользователь редактировал объекты в хранилище объектов. При условии, с одним доменом, я могу получить связанный объект, как это:
var DBOpenRequest= window.indexedDB.open(db_name, db_version);
DBOpenRequest.onsuccess= function(event){
var db= DBOpenRequest.result;
var domains=db.transaction('domains', 'readwrite').objectStore('domains');
var query = domains.index("domain").get("stackoverflow");
};
Теперь, вот та часть, где я запутался. После того как пользователь изменил свойства, которые они хотят изменить/добавить новые свойства по своему усмотрению, мне нужно сохранить их изменения, заменив объект, полученный выше, новым объектом, созданным пользователем. (или изменить исходный объект и сохранить изменения).
Я думаю, мне нужно использовать IDBObjectStore.put()
для этого.
put()
метод принимает два параметра, один необходимый и один дополнительный:
value
The value to be stored.
key
The key to use to identify the record. If unspecified, it results to null.
Второй параметр является необязательным, предположительно за исключением случаев, в которых вы с помощью встроенных ключей. Я использую ключи вне очереди, которые были сгенерированы генератором ключей.
Как я могу получить (автоматически сгенерированный, вне линии) ключ объекта, который я получил через мой индекс, поэтому я могу связаться с хранилищем объектов, который хочу изменить ранее существовавший объект и не создать новый?
Есть ли другой способ, которым я должен заниматься этим?
Чтобы уточнить, последствия вашего ответа заключаются в том, что любое хранилище объектов, которое имеет индекс, который ссылается на него, и имеет свой флаг (уникальный индекс), установленный в 'true', не может вообще изменять свои существующие объекты ? – LukeP
Точно. Я провел много исследований и сделал образцы POC, и невозможно выполнить обновление, если на нем присутствует индекс. То же самое ясно из примечания W3C по индексам, которые я представил в своем ответе. Кроме того, вы можете прочитать другие 2 URL. Для части решения - используйте keyPath. – hagrawal
Проверьте это - http://bl.ocks.org/nolanlawson/c9a4673830de2b185b8b – hagrawal