1

Я пытаюсь обмотать голову вокруг 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. 

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

Как я могу получить (автоматически сгенерированный, вне линии) ключ объекта, который я получил через мой индекс, поэтому я могу связаться с хранилищем объектов, который хочу изменить ранее существовавший объект и не создать новый?

Есть ли другой способ, которым я должен заниматься этим?

ответ

1

Ниже приведен текст от IndexedDB specs for indexes.

Каждый индекс также имеет уникальный флаг. Если для этого флага установлено значение true, индекс гарантирует, что две записи в индексе не имеют одного и того же ключа. Если запись в хранилище объектов, на которые ссылается указатель индекса, была вставлена ​​или изменена так, чтобы оценивать путь ключа индекса в . Новое значение дает результат, который уже существует в индексе, , а затем попытка изменения объекта магазин не работает.

Так, «поставил()» не может быть использован, если уникальный индекс создан на этой собственности.Итак, вы можете создать первичный ключ, то есть использовать keyPath при создании хранилища объектов.

var objectStore = db.createObjectStore("domains", {keyPath: "domain"}); 

Проверьте ниже 2 URL-адресов, которые помогут вам получить больше понимания того, что это не представляется возможным выполнить обновление, если существует уникальный индекс на нем.

+0

Чтобы уточнить, последствия вашего ответа заключаются в том, что любое хранилище объектов, которое имеет индекс, который ссылается на него, и имеет свой флаг (уникальный индекс), установленный в 'true', не может вообще изменять свои существующие объекты ? – LukeP

+0

Точно. Я провел много исследований и сделал образцы POC, и невозможно выполнить обновление, если на нем присутствует индекс. То же самое ясно из примечания W3C по индексам, которые я представил в своем ответе. Кроме того, вы можете прочитать другие 2 URL. Для части решения - используйте keyPath. – hagrawal

+0

Проверьте это - http://bl.ocks.org/nolanlawson/c9a4673830de2b185b8b – hagrawal

0

Для будущих читателей. В качестве альтернативы использования ключевого ресурса:

Вместо использовании IDBObjectStore.put() вы можете итерации по объектам в хранилище объектов с IDBObjectStore.openCursor()

После того, как вы нажмете на объект, который вы ищете, вы можете использовать: