首页 > 解决方案 > 为什么indexedDB在添加到数据库时会跳过一些数据?

问题描述

我正在使用 javascript 来执行此操作。我想将数据添加到数据库(indexedDB)。数据将作为 json 来自 web 服务,我正在循环通过它并将其添加到带有 keyPath 的 objectStore。

当我查看来自 web 服务的数据时,我有一个包含 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)

标签: javascriptjsondatabaseindexeddbobject-storage

解决方案


一种方法是在您的 json 中创建一个唯一的 keyPath,并将其设置为索引数据库中的 keyPath。


推荐阅读