indexeddb objectstore.add() keypath = 'id'
indexeddb objectstore.add() keypath = 'id'
我有一些对象存储,并在它们之间进行了拆分。在 chrome 扩展的初始安装期间,我将数据添加到各种对象存储中,并且我想确保数据正确对齐。所以当安装过程中出现不同步时。 "keypath / id" 将正确匹配。没什么大不了的。
初始安装后出现问题。并添加另一条记录。
初始记录的 "id" / keyPath / 键显示 id:1、id:2、id:3 等...
但用于初始安装后的记录。在将其添加到对象存储之前,我不再知道密钥是什么。有没有我遗漏的代码片段,所以我可以创建一个对象并添加到 objecstore,以增加 id,或者我是否搞砸了最初创建 id: 1 并且应该使用类似 keyPath: 1 或 key: 1 或 Primarykey 的东西: 1?
我可以花很长的时间绕过它,并使用一些承诺,并且
objectstore.add(object)
.then(objecstore.get(event.key)
.then(objestore.put(key, {"id":key})
我确实记得上面的正确承诺代码。但是 objectstore.add,然后在添加后获取密钥,然后 .put({"id": key}) 更新 "id" 就完成了,这就是它的重点。我正在努力避免首先需要这样做。
有点像 SQL 中的数据库,并且有 2 个主键,它们是数字,自动增量,并且对于相同的 table 在各个方面都完全相同。但就我而言,密钥更新,并且 "id" 正在占用 space。并且不确定如何从初始开始删除 'id'。或者一旦完成,如何保持密钥和 'id' 同步而无需一堆额外的废话承诺。
评论下面的代码,想弄明白。我自己还没弄清楚
const ms_master = [{
//========================
//did i mess up here in creating id: and should of used like keypath:1?
//========================
"id": 1,
"baseurl": "www.example1.net",
"prefix": "ex1",
"name": "tryout1",
}, {
"id": 2,
"baseurl": "www.something.com",
"prefix": "so",
"name": "some some",
}, {
"id": 3,
"baseurl": "woops.org",
"prefix": "woo",
"name": "arghs",
}]
var db;
var request = window.indexedDB.open("mystyle", 1);
request.onerror = function(event) {
console.log("error: ")
};
request.onsuccess = function(event) {
db = event.target.result;
console.log("success: " + db);
};
request.onupgradeneeded = function(event) {
var db = event.target.result;
if (!db.objectStoreNames.contains("ms_master")) {
//========================
//did i mess up here in creating the store?
//========================
var objectStore = db.createObjectStore("ms_master", {
keypath: "id",
autoIncrement: true,
unique: true
});
objectStore.createIndex("baseurl", "baseurl", {
unique: false
});
objectStore.createIndex("prefix", "prefix", {
unique: false
});
objectStore.createIndex("name", "name", {
unique: false
});
//========================
//seems to make no difference
//========================
//objectStore.createIndex("id","id", { unique: true });
for (var i in ms_master) {
objectStore.add(ms_master[i]);
}
//========================
//once added, should i do a objecstore.get and grab data, then do a objectstore.put that does not have 'id" in it?
//========================
}
$(document).ready(function() {
document.getElementById('ms_table_add').addEventListener("click", ms_table_add);
}
function ms_table_add() {
var db;
var request = indexedDB.open('mystyle', 1);
request.onsuccess = function(e) {
db = e.target.result;
var transaction = db.transaction('ms_master', "readwrite");
var objectStore = transaction.objectStore('ms_master');
var myobj = [
"id",
"name",
"prefix",
"baseurl"
];
var myarray = {};
for (var h = 0; h < myobj.length; h++) {
if (h == 0) {
//========================
//am i not getting the correct code to get id and keypath to sync up?
//========================
//{name: 'ms_master', keyPath: 'id'}
//myarray[myobj[h]] = 'id';
} else {
var temp = document.getElementById('ms_table_add_' + myobj[h]).value;
if (typeof temp !== "undefined" && temp !== null && temp !== "") {
myarray[myobj[h]] = temp;
}
}
}
objectStore.add(myarray);
//==============================
//trying to avoid extra promises to add, then get key, then update id here.
//==============================
document.getElementById("ms_listings_master_add").innerHTML = "";
}
}
function site_adding() {
//function that builds up a html form / textareas / inputs and .innerhtml into
//<div id="ms_listings_master_add"></div>
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button id="site_adding">add a site</button>
</br>
<div id="ms_listings_master_add"></div>
您同时使用了两个功能 - 内联键和键生成器。我会分别解释它们,然后它们是如何组成的。
内联和外联键
内联键 键值出现在记录本身中 - 具有 keyPath 的商店使用内联键。相比之下,外联键的键值是分开的。
var storeWithOutOfLineKeys = db.createObjectStore('s1');
storeWithOutOfLineKeys.put({name: 'alice'}, 1);
var storeWithInLineKeys = db.createObjectStore('s2', {keyPath: 'id'});
storeWithInLineKeys.put({name: 'bob', id: 1});
如果您不为具有外联键的商店提供显式键,则对 put()
和 add()
的调用将失败。如果您 do 向具有内联键的商店提供显式键,则对 put()
和 add()
的调用将失败,如果记录不包含,则会失败行内键值(例如,在上例中缺少 id
属性)
密钥生成器
当您指定 autoIncrement: true
时,您正在使用规范所称的 密钥生成器 。对于添加的每条记录,如果没有另外指定,那么第一条将得到 1
,第二条将得到 2
,等等。您可以通过查看 put()
的结果找出使用了哪个键或 add()
请求,例如
var request = store.put({name: 'alice'});
request.onsuccess = function() {
console.log('put got generated key: ' + request.result;
};
内联密钥和密钥生成器
使用密钥生成器时,add()
和 put()
的行为会发生变化:
密钥生成器和外联密钥:调用add()
或put()
时无需传递显式密钥;如果省略,则使用生成的密钥:
var storeWithOutOfLineKeys = db.createObjectStore('s1', {autoIncrement: true});
storeWithOutOfLineKeys.put({name: 'alice'});
如果传递了显式键,将使用它,覆盖以前的记录或添加新记录。 (如果传递的密钥恰好是一个大于生成器值的数字,生成器将被设置为该数字。)
密钥生成器和内联密钥:调用add()
或put()
时无需在记录中指定密钥;如果省略,生成的键被注入到值中。
var storeWithInLineKeys = db.createObjectStore('s2', {keyPath: 'id', autoIncrement: true});
storeWithInLineKeys.put({name: 'bob'}).onsuccess = function(e) {
var id = e.target.result;
storeWithInLineKeys.get(id).onsuccess = function(e) {
console.log(JSON.stringify(e.target.result));
// {"name": "bob", "id": 1}
});
});
同样,如果记录 确实 包含一个键值,它将被使用。 (如果它是一个高于密钥生成器状态的数字,则密钥生成器将被调整。)
我相信最后一个案例与您的代码所做的相匹配——内联键和键生成器。您可以使用 add()
和 put()
请求的结果来确定添加的键,并通过在记录中明确指定键来更新记录:
storeWithInLineKeys.put({name: 'eve', id: 1}); // overwrites old #1
这就是我一直在寻找的((来自 How do I specify key when adding records to objectStore w/ in IndexedDB?))以及您的 post Joshua Bell。它点击了 :) 谢谢!
objectStore.add({name: "myData"}, 47);
我需要在下面进行重组,所以我可以完全删除 'id' 本身,并且在上面的文本中仍然有关键符号 # 47。
const ms_master = [{
"id": 1,
"baseurl": "www.example1.net",
"prefix": "ex1",
"name": "tryout1",
}, {
"id": 2,
"baseurl": "www.something.com",
"prefix": "so",
"name": "some some",
}, {
"id": 3,
"baseurl": "woops.org",
"prefix": "woo",
"name": "arghs",
}]
你的第一个例子
var storeWithOutOfLineKeys = db.createObjectStore('s1');
storeWithOutOfLineKeys.put({name: 'alice'}, 1);
你的第 4 个例子
var storeWithOutOfLineKeys = db.createObjectStore('s1', {autoIncrement: true});
storeWithOutOfLineKeys.put({name: 'alice'});
新做...
var storeWithOutOfLineKeys = db.createObjectStore('s1', {autoIncrement: true});
//for initial putting data into indexeddb (during install of chrome extension)
storeWithOutOfLineKeys.add({name: 'alice'}, 1);
//for adding data at a later time
storeWithOutOfLineKeys.add({name: 'alice'});
//for updating something...
storeWithOutOfLineKeys.put({name: 'alice'}, 1);
我有一些对象存储,并在它们之间进行了拆分。在 chrome 扩展的初始安装期间,我将数据添加到各种对象存储中,并且我想确保数据正确对齐。所以当安装过程中出现不同步时。 "keypath / id" 将正确匹配。没什么大不了的。
初始安装后出现问题。并添加另一条记录。 初始记录的 "id" / keyPath / 键显示 id:1、id:2、id:3 等...
但用于初始安装后的记录。在将其添加到对象存储之前,我不再知道密钥是什么。有没有我遗漏的代码片段,所以我可以创建一个对象并添加到 objecstore,以增加 id,或者我是否搞砸了最初创建 id: 1 并且应该使用类似 keyPath: 1 或 key: 1 或 Primarykey 的东西: 1?
我可以花很长的时间绕过它,并使用一些承诺,并且
objectstore.add(object)
.then(objecstore.get(event.key)
.then(objestore.put(key, {"id":key})
我确实记得上面的正确承诺代码。但是 objectstore.add,然后在添加后获取密钥,然后 .put({"id": key}) 更新 "id" 就完成了,这就是它的重点。我正在努力避免首先需要这样做。
有点像 SQL 中的数据库,并且有 2 个主键,它们是数字,自动增量,并且对于相同的 table 在各个方面都完全相同。但就我而言,密钥更新,并且 "id" 正在占用 space。并且不确定如何从初始开始删除 'id'。或者一旦完成,如何保持密钥和 'id' 同步而无需一堆额外的废话承诺。
评论下面的代码,想弄明白。我自己还没弄清楚
const ms_master = [{
//========================
//did i mess up here in creating id: and should of used like keypath:1?
//========================
"id": 1,
"baseurl": "www.example1.net",
"prefix": "ex1",
"name": "tryout1",
}, {
"id": 2,
"baseurl": "www.something.com",
"prefix": "so",
"name": "some some",
}, {
"id": 3,
"baseurl": "woops.org",
"prefix": "woo",
"name": "arghs",
}]
var db;
var request = window.indexedDB.open("mystyle", 1);
request.onerror = function(event) {
console.log("error: ")
};
request.onsuccess = function(event) {
db = event.target.result;
console.log("success: " + db);
};
request.onupgradeneeded = function(event) {
var db = event.target.result;
if (!db.objectStoreNames.contains("ms_master")) {
//========================
//did i mess up here in creating the store?
//========================
var objectStore = db.createObjectStore("ms_master", {
keypath: "id",
autoIncrement: true,
unique: true
});
objectStore.createIndex("baseurl", "baseurl", {
unique: false
});
objectStore.createIndex("prefix", "prefix", {
unique: false
});
objectStore.createIndex("name", "name", {
unique: false
});
//========================
//seems to make no difference
//========================
//objectStore.createIndex("id","id", { unique: true });
for (var i in ms_master) {
objectStore.add(ms_master[i]);
}
//========================
//once added, should i do a objecstore.get and grab data, then do a objectstore.put that does not have 'id" in it?
//========================
}
$(document).ready(function() {
document.getElementById('ms_table_add').addEventListener("click", ms_table_add);
}
function ms_table_add() {
var db;
var request = indexedDB.open('mystyle', 1);
request.onsuccess = function(e) {
db = e.target.result;
var transaction = db.transaction('ms_master', "readwrite");
var objectStore = transaction.objectStore('ms_master');
var myobj = [
"id",
"name",
"prefix",
"baseurl"
];
var myarray = {};
for (var h = 0; h < myobj.length; h++) {
if (h == 0) {
//========================
//am i not getting the correct code to get id and keypath to sync up?
//========================
//{name: 'ms_master', keyPath: 'id'}
//myarray[myobj[h]] = 'id';
} else {
var temp = document.getElementById('ms_table_add_' + myobj[h]).value;
if (typeof temp !== "undefined" && temp !== null && temp !== "") {
myarray[myobj[h]] = temp;
}
}
}
objectStore.add(myarray);
//==============================
//trying to avoid extra promises to add, then get key, then update id here.
//==============================
document.getElementById("ms_listings_master_add").innerHTML = "";
}
}
function site_adding() {
//function that builds up a html form / textareas / inputs and .innerhtml into
//<div id="ms_listings_master_add"></div>
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button id="site_adding">add a site</button>
</br>
<div id="ms_listings_master_add"></div>
您同时使用了两个功能 - 内联键和键生成器。我会分别解释它们,然后它们是如何组成的。
内联和外联键
内联键 键值出现在记录本身中 - 具有 keyPath 的商店使用内联键。相比之下,外联键的键值是分开的。
var storeWithOutOfLineKeys = db.createObjectStore('s1');
storeWithOutOfLineKeys.put({name: 'alice'}, 1);
var storeWithInLineKeys = db.createObjectStore('s2', {keyPath: 'id'});
storeWithInLineKeys.put({name: 'bob', id: 1});
如果您不为具有外联键的商店提供显式键,则对 put()
和 add()
的调用将失败。如果您 do 向具有内联键的商店提供显式键,则对 put()
和 add()
的调用将失败,如果记录不包含,则会失败行内键值(例如,在上例中缺少 id
属性)
密钥生成器
当您指定 autoIncrement: true
时,您正在使用规范所称的 密钥生成器 。对于添加的每条记录,如果没有另外指定,那么第一条将得到 1
,第二条将得到 2
,等等。您可以通过查看 put()
的结果找出使用了哪个键或 add()
请求,例如
var request = store.put({name: 'alice'});
request.onsuccess = function() {
console.log('put got generated key: ' + request.result;
};
内联密钥和密钥生成器
使用密钥生成器时,add()
和 put()
的行为会发生变化:
密钥生成器和外联密钥:调用add()
或put()
时无需传递显式密钥;如果省略,则使用生成的密钥:
var storeWithOutOfLineKeys = db.createObjectStore('s1', {autoIncrement: true});
storeWithOutOfLineKeys.put({name: 'alice'});
如果传递了显式键,将使用它,覆盖以前的记录或添加新记录。 (如果传递的密钥恰好是一个大于生成器值的数字,生成器将被设置为该数字。)
密钥生成器和内联密钥:调用add()
或put()
时无需在记录中指定密钥;如果省略,生成的键被注入到值中。
var storeWithInLineKeys = db.createObjectStore('s2', {keyPath: 'id', autoIncrement: true});
storeWithInLineKeys.put({name: 'bob'}).onsuccess = function(e) {
var id = e.target.result;
storeWithInLineKeys.get(id).onsuccess = function(e) {
console.log(JSON.stringify(e.target.result));
// {"name": "bob", "id": 1}
});
});
同样,如果记录 确实 包含一个键值,它将被使用。 (如果它是一个高于密钥生成器状态的数字,则密钥生成器将被调整。)
我相信最后一个案例与您的代码所做的相匹配——内联键和键生成器。您可以使用 add()
和 put()
请求的结果来确定添加的键,并通过在记录中明确指定键来更新记录:
storeWithInLineKeys.put({name: 'eve', id: 1}); // overwrites old #1
这就是我一直在寻找的((来自 How do I specify key when adding records to objectStore w/ in IndexedDB?))以及您的 post Joshua Bell。它点击了 :) 谢谢!
objectStore.add({name: "myData"}, 47);
我需要在下面进行重组,所以我可以完全删除 'id' 本身,并且在上面的文本中仍然有关键符号 # 47。
const ms_master = [{
"id": 1,
"baseurl": "www.example1.net",
"prefix": "ex1",
"name": "tryout1",
}, {
"id": 2,
"baseurl": "www.something.com",
"prefix": "so",
"name": "some some",
}, {
"id": 3,
"baseurl": "woops.org",
"prefix": "woo",
"name": "arghs",
}]
你的第一个例子
var storeWithOutOfLineKeys = db.createObjectStore('s1');
storeWithOutOfLineKeys.put({name: 'alice'}, 1);
你的第 4 个例子
var storeWithOutOfLineKeys = db.createObjectStore('s1', {autoIncrement: true});
storeWithOutOfLineKeys.put({name: 'alice'});
新做...
var storeWithOutOfLineKeys = db.createObjectStore('s1', {autoIncrement: true});
//for initial putting data into indexeddb (during install of chrome extension)
storeWithOutOfLineKeys.add({name: 'alice'}, 1);
//for adding data at a later time
storeWithOutOfLineKeys.add({name: 'alice'});
//for updating something...
storeWithOutOfLineKeys.put({name: 'alice'}, 1);