Почему indexedDB пропускает некоторые данные при добавлении в базу данных? - PullRequest
0 голосов
/ 21 января 2020

Я использую javascript для этого. Я хочу добавить данные в базу данных (indexedDB). Данные будут поступать из веб-сервиса как json, и я перебираю их и добавляю в хранилище объектов с помощью keyPath.

Когда я смотрю на данные из веб-сервиса, у меня есть массив из 186 объектов, но когда я читаю данные из indexedDB, у меня есть 151. Когда я пошел, чтобы проверить базу данных, чтобы увидеть, были ли данные там , это не было ... Так что что-то должно происходить с моей функцией добавления.

Вот мой код:

Открытие базы данных с помощью objectStore:

let db;
let request = window.indexedDB.open("WHS", 4);

request.onerror = function(event) {
    console.log(event.target.errorCode);
};

request.onsuccess = function(event) {
    db = event.target.result;
};

request.onupgradeneeded = function(event) {
    let db = event.target.result;
    let palletStore = db.createObjectStore("pallets", { keyPath: "palletno" });
};

Добавление данных после передачи их в мою функцию:

function addPalletsToIDB(pallets) {
    let transaction = db.transaction(["pallets"], "readwrite");
    let objectStore = transaction.objectStore("pallets");
    $.each(pallets, function(i, pallet) {
        let request = objectStore.put(pallet);
    })
    request.onsuccess = function(event) {
        console.log('Added pallets : ', event.target.response);
    };
    transaction.oncomplete = function() {
        getPalletDataFromIDB();
    }
};

Чтение данных:

function getPalletDataFromIDB() {
    palletsFromIDB = [];
    let transaction = db.transaction(["pallets"], IDBTransaction.READ);
    transaction.oncomplete = function(event) {
        console.log(event);
    };
    transaction.onerror = function(event) {
        console.log(event.type);
    };
    let objectStore = transaction.objectStore("pallets");
    objectStore.openCursor().onsuccess = function(event) {
        let cursor = event.target.result;
        if (cursor) {
            palletsFromIDB.push(cursor.value);
            cursor.continue();
        }
        transaction.oncomplete = function() {
            console.log("[palletsFromIDB] ", palletsFromIDB);
            toastr.info("Got pallets");
        };
    };
};

из веб-службы: {pallets: Array (186)} из indexedDB: [palletsFromIDB ] (151)

1 Ответ

0 голосов
/ 22 января 2020

Один из способов сделать это - просто создать уникальный keyPath в вашем json и сделать его вашим keyPath в индексированном дБ.

...