我有一张表格,姓氏,姓氏,电子邮件和一个矩形。我必须在矩形中插入一个带有时间轴点数组的数组。我创建了一个带有表单,姓氏,姓氏和电子邮件的客户,将它们添加到indexeddb,稍后加载它们以插入矩形数组。之后,我想将newobjectstore
放在indexeddb中,电子邮件与我选择/插入的客户相同。但是使用这段代码,我的数组将被放入一个具有自己ID的新Objectstore中。
function cmd_SaveRec(hypeDocument, elementID)
{
hypeDocument.getElementById('rectext').innerHTML = hypeDocument.getElementById('beschriftung').value;
var store_cust = db.transaction(["customer"], "readwrite").objectStore("customer").index("rectangle");
var cursorReq = store_cust.openCursor();
cursorReq.onsuccess = function (e) {
cursor = e.target.result;
if(cursor) {
if(cursor.value.email == mailAdd)
{
//cursor.update([rec_ar]);
if(store_cust.objectStore.put({rectangle: [rec_ar]}))
{
console.info(store_cust.objectStore);
console.info('Gespeichert');
alert("Gespeichert");
} else {
console.info('cmd_SaveRec::Problem');
}
}
cursor.continue();
}
};
cursorReq.onerror = function(e) {
console.log("Error");
console.dir(e);
}
}
var store_cust = evt.currentTarget.result.createObjectStore( DB_STORE_NAME_CUSTOMER,{keyPath:' cust_id',autoIncrement:true});
store_cust.createIndex('form', 'form', { unique: false }); //
store_cust.createIndex('surname', 'surname', { unique: false });
store_cust.createIndex('lastname', 'lastname', { unique: false });
store_cust.createIndex('email', 'email', { unique: true });
store_cust.createIndex('rectangle', 'rectangle', { unique: false, multiEntry: true });
答案 0 :(得分:0)
objectStor.put(data, key)
或 如文档中所述:
IDBObjectStore接口的put()方法更新数据库中的给定记录,或者如果给定项目尚不存在则插入新记录。 (source developer.mozilla.org)
您使用的方法objectStore.put()
用于插入或更新任务。如果我找到你正确的你正在寻找更新 - cursor.update()
是你的朋友(你注释掉了)。 - 这是这里的首选方法!
但是你可以用这两种方法做到这一点。假设您想要更新但如果记录不存在则创建一个。在这种情况下,引擎必须知道您的记录是否存在以及您尝试更新的记录。
如果您的objectStore
使用 autoIncrementing主键,则记录的标识符不在记录中本身,因此您必须提供id作为第二个put()
函数的参数。
我发现自己更容易照顾ids。然后id是记录的一部分(可在objectStore创建时提供的keypath
下找到)。 然后您的代码可以按预期工作...当然您必须为ID添加一个键:值对。
// create a store with ids YOU handle e.g.
var request = indexedDB.open(dbname, dbversion+1);
request.onerror = errorHandler;
request.onupgradeneeded = function(event){
var nextDB = request.result;
if (!nextDB.objectStoreNames.contains('account')) {
nextDB.createObjectStore('account', {keyPath: "id", autoIncrement: true});
}
}
// Your record has to llok like this
{id: 123456789, rectangle: [rec_ar]}
// Now your code above should work
如果您的数据库中有主键:
store_cust.objectStore.put({rectangle: [rec_ar]}, PRIMARY_KEY)
// where PRIMARY_KEY is the id of this specific record
不要使用if-else来检查事务的完整性 - 它是异步的 - if / else每次都在这里 - 使用我在上面的示例中所述的回调({{1} })。
你应该从我的引用中阅读文档。 Mozilla是indexedDB的一个很好的资源。