【发布时间】:2014-11-19 01:54:18
【问题描述】:
问题是当您在同一个 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 中,如果您启动小提琴并单击“将 1 数据添加到 IndexedDb”,则会将 1000 个条目添加到“客户”表中。如果您随后单击“将 2 数据添加到 IndexedDb”,则会将 1000 个条目添加到“供应商”表中,但会删除“客户”表中的 1000 个。
还有其他人遇到过这个吗?这是 IndexedDb 规范的一部分吗? Chrome 似乎没有这个问题。
编辑:找到这个W3 Org IndexedDB Recommendation:“在给定的对象存储中永远不可能有多个具有相同键的记录。” Apple 似乎已经在数据库级别应用了这一点。
【问题讨论】:
-
哇,太糟糕了。我还没有尝试过 iOS 8,但从用户那里得到了一些报告,说我的基于 iDB 的应用程序根本无法在 iOS 8 中运行,这可以解释这一点。我不能说我很惊讶,这符合我的阴谋论stackoverflow.com/a/20110477/786644 :)
-
天哪。即使你让它指定autoIncreement,它似乎也被打破了。
-
呃。我试图通过使用一个事务来修复它 - 您可以在一个事务中指定 N 个对象存储。不,会引发错误。
-
据我所知,您必须指定键,并且必须使它们在每个数据库中都是唯一的。今天打算在一篇博文中写出来。
-
天哪,是的。以多种方式。我有一个解决方法,我要写博客了。我在 raymondcamden.com。它应该在 30 分钟内启动。
标签: javascript mobile-safari ios8 indexeddb