问题是当你在同一个indexeddb中有两个不同的对象存储时,主键值似乎是"共享"遍布所有商店。
<body>
<script type="text/javascript">
//prefixes of implementation that we want to test
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
//prefixes of window.IDB objects
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange
if (!window.indexedDB) {
window.alert("Your browser doesn't support a stable version of IndexedDB.")
}
var db;
var request = window.indexedDB.open("newDatabase", 4);
request.onerror = function(event) {
console.log("error: ");
};
request.onsuccess = function(event) {
db = request.result;
console.log("success: "+ db);
};
request.onupgradeneeded = function(event) {
var db = event.target.result;
var objectStore = db.createObjectStore("customers", {keyPath: "arseid"});
var objectStore = db.createObjectStore("test", {keyPath: "id"});
}
function add1() {
var x = new Date();
var h1 = x.getHours();
var m1 = x.getMinutes();
var s1 = x.getSeconds();
console.log('starting insert on ' + h1 + ':' + m1 + ':' + s1);
var tx = db.transaction(["customers"], "readwrite");
for (var i = 0; i < 1000; i++) {
var request = tx.objectStore("customers")
.put({ arseid: i, name: "Jonathan Smith", email: "jonathan.smith@anemailaddress.com", favourite: "chocolate cake", pet: "rudolph the red nose reindeer", address: "999 letsbe avenue, townton, countyshire" });
}
tx.oncomplete = function (e) {
// Re-render all the todo's
var x2 = new Date();
var h2 = x2.getHours();
var m2 = x2.getMinutes();
var s2 = x2.getSeconds();
console.log('transaction complete ' + h2 + ':' + m2 + ':' + s2);
}
}
function add2() {
//tx 2
var tx2 = db.transaction(["test"], "readwrite");
for (var i = 0; i < 1000; i++) {
var request2 = tx2.objectStore("test")
.put({ id: i, name: "Robwin Mwengway", email: "jonathan.smith@anemailaddress.com", favourite: "chocolate cake", pet: "rudolph the red nose reindeer", address: "999 letsbe avenue, townton, countyshire" });
}
tx2.oncomplete = function (e) {
var x3 = new Date();
var h3 = x3.getHours();
var m3 = x3.getMinutes();
var s3 = x3.getSeconds();
console.log('transaction complete ' + h3 + ':' + m3 + ':' + s3);
}
}
</script>
<button onclick="add1()">Add1 data to indexedDb</button>
<button onclick="add2()">Add2 data to indexedDb</button>
</body>
(小提琴:http://jsfiddle.net/jonnyknowsbest/4pdp8vxe/)
在iOS8中,如果你运行小提琴并点击&#34;将1数据添加到IndexedDb&#34;,则会有1000个条目被添加到&#34;客户&#34;表。然后,如果您单击&#34;将2数据添加到IndexedDb&#34;,则会将1000个条目添加到&#34;供应商&#34;表,但来自&#34;客户&#34;被删除了。
还有其他人遇到过这个吗?这是IndexedDb规范的一部分吗? Chrome似乎没有这个问题。
编辑:找到这个W3 Org IndexedDB Recommendation:&#34;在给定的对象商店中,永远不会有多个具有相同密钥的记录。&#34; Apple似乎已经在数据库级别应用了它。
答案 0 :(得分:20)
我可以确认iOS8肯定是错误的。我尝试了一些解决方法,但我能建议的最好的是一个主键,它将一些唯一的字符串(如objectStore的名称)与一个数字组合在一起。因此,例如,给定两个名为people和notes的objectStore,我将使用如下的键存储数据:
人/ X 笔记/ X
您可以手动设置X,或者使用objectStore上的.count()方法查找计数并添加一个。这是一个例子:
//Define a person
var person = {
name:"Ray",
created:new Date().toString(),
}
//Perform the add
db.transaction(["people"],"readwrite").objectStore("people").count().onsuccess = function(event) {
var total = event.target.result;
console.log(total);
person.id = "person/" + (total+1);
var request = db.transaction(["people"],"readwrite").objectStore("people").add(person);
request.onerror = function(e) {
console.log("Error",e.target.error.name);
//some type of error handler
}
request.onsuccess = function(e) {
console.log("Woot! Did it");
}
}
请注意,我为此操作系统指定了“id”的keyPath。
答案 1 :(得分:1)
我有一个类似的问题但是我对objectstore的第一个插入是一个只有用户名和电子邮件的小数组,而第二个对象库非常大,有几个嵌套的数据数组。
下面的插入方法会在所有项目上回调成功,但只有第二个对象存储区才能正确写入数据库。
当我尝试颠倒我写入数据库的顺序(首先写入大型对象库项目,然后写入用户名/电子邮件)时,两个对象库都被正确写入,但主键在两个对象库之间共享。 飞行员主要钥匙:1,2,3,4,5 AC主键:6,7,8 ......
function insert_GroupRecord(Record, Store){
//update individual sync record
var trans = dbGroup.transaction([Store],"readwrite");
var store = trans.objectStore(Store);
var request = store.put(Record);
request.onsuccess = function(e){
IOS_postMessage({Message:"SyncStatus", status:"Group_Insert "+Store});
};
request.onerror = function(e){
GroupSyncERROR = true;
//IOS_postMessage({Message:"SyncStatus", status:"GroupSyncFail "+Store});
};
request.onupgradeneeded = function(evt){
var objectStore = evt.currentTarget.result.createObjectStore("AC",{ keyPath: "id", autoIncrement: true });
objectStore.createIndex("ident", "ident", { unique: true });
var objectStore2 = evt.currentTarget.result.createObjectStore("Pilots",{ keyPath: "id", autoIncrement: true });
objectStore2.createIndex("chatname", "chatname", { unique: true });
console.log("KFM_Group Upgrade Completed");
};
}