Как получить ключ indexeddb для использования в функции put - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь получить ключ определенной записи в indexedDb для обновления. Я искал повсюду, включая собственную документацию IDB, и все еще не нашел то, что искал.

Это моя база данных -> Индексированные записи в БД

То, что я пытаюсь сделать в приведенном ниже коде, это получить значение keyPath 'id', которое будет использоваться для получения указанной записи, которая будет обновлена ​​с помощью функции put.

//Save page when choosen
var cv = document.getElementById('myCanvas');
    let bits = cv.toDataURL("image/png");

    let ob = {
        created: new Date(),
        data: bits
    };

    let trans = db.transaction([currentNotebook], 'readwrite');

    let key = trans.objectStore(currentNotebook).get(getAllKeysRequest.result[currentPage]);

    let editReq = trans.objectStore(currentNotebook).put(ob, key);

    editReq.onerror = function (e) {
        console.log('error storing data');
        console.error(e);
    }

Произошла ошибка, когда во время выполнения вышеуказанного кода

<font cUncaught DOMException: Failed to execute 'put' on 'IDBObjectStore': The object store uses in-line keys and the key parameter was provided.

1 Ответ

0 голосов
/ 17 мая 2019

Итак, есть две вещи, которые, похоже, доставляют вам неприятности.

1) В связи с вашей ошибкой Uncaught DOMException сообщение означает, что при определении хранилища объектов вы указали keyPath из id, что означает, что вы используете встроенные ключи для этого хранилища. Это означает, что когда вы используете метод .put(), вы не можете передать ключ как второй параметр этого метода, но вы должны поместить его в объект, который вы пытаетесь put. Итак, сделайте ob.id = key и затем просто передайте ob в put вызов.

2) Способ получения key также может быть проблемой. Запрос .get() является асинхронным вызовом, поэтому при разрешении .get() будет происходить событие onsuccess. Поэтому вам понадобится обработчик для извлечения ключа из успешного получения, и вы захотите реализовать свой вызов .put() внутри него.

Я взял ваш код и изменил его, чтобы отразить оба упомянутых мной изменения:

var cv = document.getElementById('myCanvas');
let bits = cv.toDataURL("image/png");

let ob = {
    created: new Date(),
    data: bits
};

let trans = db.transaction([currentNotebook], 'readwrite');

let key = trans.objectStore(currentNotebook).get(getAllKeysRequest.result[currentPage]);
key.onsuccess = function() {
    let _key = key.result;
    ob.id = _key;

    let editReq = trans.objectStore(currentNotebook).put(ob, key);
    editReq.onerror = function (e) {
        console.log('error storing data');
        console.error(e);
    }
}
...