Javascript IndexedDB:修改对象存储中预先存在的对象

Javascript IndexedDB:修改对象存储中预先存在的对象,javascript,html,google-chrome,indexeddb,persistent-object-store,Javascript,Html,Google Chrome,Indexeddb,Persistent Object Store,我正试着把头绕过去 我创建了一个对象存储,它使用了一个没有关键路径的 var objectStore = db.createObjectStore("domains", {autoIncrement: true }); objectStore.createIndex("domain", "domain", { unique: true, multiEntry: true }); 为了访问我的记录,我创建了一个引用我的对象存储的。索引的关键路径是我的记录的域属性 下面是我的对象存储中的一条记录的

我正试着把头绕过去

我创建了一个对象存储,它使用了一个没有关键路径的

var objectStore = db.createObjectStore("domains", {autoIncrement: true });
objectStore.createIndex("domain", "domain", { unique: true, multiEntry: true });
为了访问我的记录,我创建了一个引用我的对象存储的。索引的关键路径是我的记录的
属性

下面是我的对象存储中的一条记录的示例:

{ 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]
},

现在,这是我感到困惑的部分。一旦用户更改了想要编辑/添加新属性的属性,我需要通过将上面检索到的对象替换为用户创建的新对象来保存所做的更改。(或修改原始对象并保存更改)

我想我需要用它来做这件事

put()
方法采用两个参数,一个是必需的,一个是可选的:

value
    The value to be stored.
key
    The key to use to identify the record. If unspecified, it results to null.
对于使用内联键的实例,第二个参数可能是可选的。我使用的是由密钥生成器生成的离线密钥

如何获取通过索引检索到的对象的(自动生成的、不符合要求的)键,以便与对象存储区通信,表明我希望修改该预先存在的对象,而不是创建新对象

我还有别的办法吗

下面是来自的文本

每个索引也有一个唯一的标志。当此标志设置为true时 索引强制要求索引中没有两个记录具有相同的键如果是 试图删除索引的引用对象存储中的记录 插入或修改,以便在 记录新值生成索引中已存在的结果, 然后,尝试修改对象存储失败

因此,如果在该属性上创建了唯一索引,则不能使用“put()因此,您可以创建主键,即在创建对象存储时使用keyPath。

var objectStore = db.createObjectStore("domains", {keyPath: "domain"});
检查下面2个URL,这将帮助您更深入地了解如果存在唯一索引,则无法执行更新

  • (第9点)

    • 给未来的读者。作为使用keypath的替代方法:

      您可以在对象存储区中使用

      一旦击中要查找的对象,您可以使用:

      • 如果从索引中删除
        unique
        属性
      • 然后,如果需要保持
        唯一

      为了澄清这一点,您的答案的含义是,任何具有引用它的索引且其(索引的)
      unique
      标志设置为
      true
      的对象存储都不能修改其现有对象。我做了大量的研究并制作了POC样本,如果其中存在索引,则不可能执行更新。我在回答中提供的W3C关于索引的说明也非常清楚。此外,您还可以阅读其他2个URL。对于解决方案部分-使用keyPath。如果我按照您的建议使用数组作为密钥路径,这是否意味着我可以向
      IDBObjectStore.get()调用提供数组的单个元素?或者我必须提供一个完整的数组用于比较吗?即使在创建对象存储时使用数组作为键路径,也可以使用单个元素进行搜索。因此,对于
      var objectStore=db.createObjectStore(“域”{keyPath:[“域1”,“域2”]})您可以在域1和域2上搜索。使用array is key path时唯一需要注意的是,它的行为类似于复合主键,这意味着domain1和domain2一起将代表一个唯一的条目,因此您仍然可以为domain1和domain2插入两个相同的值。因此,从技术上讲,整个数组的行为类似于键,在同一个存储中有两个对象,每个对象恰好有一个元素
      “domain1”
      ,这是完全合法的。如果是这样,并且我将
      “domain1”
      作为参数传递给get调用,它会返回它运行到的第一个条目吗?
      var objectStore = db.createObjectStore("domains", {keyPath: "domain"});