indexeddb put不更新值,它创建一个新的(id)

时间:2017-06-26 14:57:03

标签: javascript arrays indexeddb

我有一张表格,姓氏,姓氏,电子邮件和一个矩形。我必须在矩形中插入一个带有时间轴点数组的数组。我创建了一个带有表单,姓氏,姓氏和电子邮件的客户,将它们添加到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 });

1 个答案:

答案 0 :(得分:0)

简短回答

  • objectStor.put(data, key)
  • 中提供标识符/密钥作为第二个参数
  • 使用IDBCursor并更新as stated here in the docs

解释

如文档中所述:

  

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的一个很好的资源。