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

sdnqo3pr  于 2023-04-18  发布在  IndexedDB
关注(0)|答案(1)|浏览(222)

我有一个表格与形式,姓氏,姓氏,电子邮件和一个矩形.我必须插入,在矩形,一个数组与时间线等点的数组.我创建一个客户与形式,姓氏,姓氏和电子邮件,将它们添加到indexeddb,加载它们以后插入矩形数组.之后,我想把newobjectstore放在indexeddb中,其中的email与我选择/插入的客户的email相同。但是使用此代码,我的数组将被放入一个新的Objectstore中,并具有自己的ID。

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 });
r1zhe5dt

r1zhe5dt1#

简答

  • 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()函数的第二个参数。
我发现自己处理id更容易。然后id是记录的一部分(在objectStore创建时提供的keypath下可以找到)。然后您的代码可以按预期工作......当然,您必须为id添加一个key:value对。

示例

// 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来检查事务的完整性-它是异步的-如果/else每次都在这里-使用回调,就像我在上面的例子中所说的那样(onsuccess)。

你应该读一下我引用的文档。Mozilla是一个很好的indexedDB资源。

相关问题