我试图绕过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
属性中出现的每个条目都保证在由我的对象存储区的每个记录中的每个域密钥值的并集组成的集合中是唯一的。 I.E.您在我的对象库中的其他任何地方都找不到这些域名。
我需要让用户编辑对象库中的对象。提供单个域,我可以像这样检索关联的对象:
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.
对于使用内联键的实例,第二个参数可能是可选的。我使用的是使用密钥生成器生成的外键。
如何获取通过索引检索的对象的(自动生成的,外联的)键,以便我可以与要修改该预先存在的对象的对象库进行通信,而不是创造一个新的?
我还有另一种方法吗?
答案 0 :(得分:1)
以下是IndexedDB specs for indexes的文字。
每个索引也都有一个唯一的标志。当此标志设置为true时, index强制索引中没有两个记录具有相同的密钥。 如果是 尝试在索引的引用对象库中记录 插入或修改,以便评估索引的关键路径 记录新值会产生索引中已存在的结果, 然后尝试修改对象存储失败。
因此,如果在该属性上创建唯一索引,则无法使用“put()”。 因此,您可以创建主键,即在创建对象存储时使用 keyPath 。
var objectStore = db.createObjectStore("domains", {keyPath: "domain"});
检查以下2个网址,这些网址可以帮助您更深入地了解如果存在唯一索引,则无法执行更新。
答案 1 :(得分:0)
对未来的读者。作为使用keypath的替代方法:
您可以使用IDBObjectStore.put()
IDBObjectStore.openCursor()
一旦你找到了你想要的对象,你可以使用:
unique
属性,则IDBCursor.update()
。IDBCursor.delete()
然后IDBObjectStore.add()
如果您需要将unique
保留为true
。