tutorial library introduccion data buscar javascript mobile-safari ios8 indexeddb

javascript - library - Problema clave principal en la implementación de iOS8 de IndexedDb



javascript indexeddb tutorial (2)

El problema es cuando tiene dos almacenes de objetos diferentes en el mismo indexeddb, los valores de la clave primaria parecen estar "compartidos" en todas las tiendas.

<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: "[email protected]", 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: "[email protected]", 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>

(Fiddle: http://jsfiddle.net/jonnyknowsbest/4pdp8vxe/ )

En iOS8, si ejecuta el violín y hace clic en "Agregar datos 1 a IndexedDb", se agregarán 1000 entradas a la tabla "clientes". Si luego hace clic en "Agregar datos a IndexedDb", entonces se agregan 1000 entradas a la tabla de "proveedores", pero se eliminan los 1000 de los "clientes".

¿Alguien más ha encontrado esto? ¿Es esta parte de la especificación de IndexedDb? Chrome no parece tener este problema.

EDITAR: Encontré esta recomendación de W3 Org IndexedDB : "Nunca puede haber múltiples registros en un almacén de objetos dado con la misma clave". Apple parece haber aplicado esto en el nivel de la base de datos.


Puedo confirmar que iOS8 es definitivamente buggy aquí. Intenté algunas soluciones alternativas, pero lo mejor que puedo sugerir es una clave principal que combine una cadena única, como el nombre del ObjectStore, con un número. Entonces, por ejemplo, dados dos objetos de almacén de objetos llamados personas y notas, almacenaría datos con claves como las siguientes:

personas / X notas / X

Puede configurar X manualmente, o usar el método .count () en el ObjectStore para encontrar el recuento y agregar uno. Aquí hay un ejemplo:

//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"); } }

Tenga en cuenta que especificé keyPath de "id" para este sistema operativo.


Tuve un problema similar, sin embargo, mi primera inserción en el almacén de objetos fue una pequeña matriz con solo un nombre de usuario y correo electrónico, y el segundo almacén de objetos era muy grande con varias matrices de datos anidadas.

Mi método de inserción a continuación llamaría exitosamente a todos los elementos, sin embargo, solo el segundo almacén de objetos se escribiría en la base de datos correctamente.

Cuando intenté invertir el orden en el que escribía en la base de datos (escribiendo primero los elementos grandes del almacén de objetos y luego el nombre de usuario / correo electrónico), ambos almacenes de objetos se escribieron correctamente, sin embargo, las claves principales se compartieron entre los dos almacenes de objetos. Pilotos Clave principal: 1,2,3,4,5 AC Clave principal: 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"); }; }