向IndexedDB添加数据时出现问题

9rnv2umw  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(306)

我正在遵循MDN guide,如果我使用指南中提供的数据(customerData),它可以在我的计算机上工作。我能够打开我自己的IndexedDB,创建对象存储并创建索引,它只是总是空的,所以我认为问题出在事务上。
的确,第一行代码来自向数据库添加数据部分(const transaction = db.transaction([“customers”],“readwrite”);)会给我带来问题,因为(我认为)db只是以前在onupgradeneeded事件中定义的,所以它会导致“未捕获的ReferenceError:db is not defined”(未定义数据库)。
我尝试将 adding data to database 部分中的所有代码 Package 在一个成功事件请求中,并添加“constdb = event.target.result;“before“const transaction db.transaction([“客户”],“读写”);“,但是在结尾的这段代码中已经有一个对成功事件的请求,我删除了它,留下“event.target.result === customer.ssn;“。虽然错误消失了(数据库仍然为空),但这并不正常。
不过,示例代码在需要升级时可以工作,而我的代码不行,即使是第一次或更改版本号时也不行,因此,我遇到的另一个问题似乎是要添加的数据。我有一个用键索引的对象数组。我正在使用一个函数将一个变量推入数组。该变量是用“document.getElementsByClassName”定义的当网页满足某些条件时,我认为问题是变量是一个HTML集合,但数组是在控制台日志中填充的。我还使用了不带Key Path的autoIncrement,根据指南,它可以保存任何类型的值。
我还尝试将整个indexedDB代码放在if函数中,因为我的控制台日志首先确认了“All done!",所以事务将数据添加到数据库中,但是数组可能是空的,因为填充它的条件还没有满足。但是,什么也没有。您可以在下面找到我的通用代码。对于冗长的解释表示歉意,但是我尝试了一些方法来修复它,但没有效果。

const array = [];
    
 setInterval(function(){

 var Button = document.getElementsByClassName(html class);

 if(Button != undefined && Button.length > 0) {
  var collection2 = document.getElementsByClassName(html class)).item(0);
  array.push(collection2);
  console.log(array);
}, 3000)

const dbName = "db name";

const request = indexedDB.open(dbName, 1);

request.onerror = (event) => {
    console.error(`Database error: ${event.target.errorCode}`);
};

request.onupgradeneeded = (event) => {
  const db = event.target.result;

  //Create an objectStore to hold information 
  //can the key path and index be the same?
  const objectStore = db.createObjectStore("Table", { autoIncrement : true });

  // Create an index to search
  objectStore.createIndex('innerHTML', 'innerHTML', { unique: true });

  // Use transaction oncomplete to make sure the objectStore creation is
  // finished before adding data into it.
  objectStore.transaction.oncomplete = (event) => {
    // Store values in the newly created objectStore.
    const TableObjectStore = db.transaction("Table", "readwrite").objectStore("Table");
        array.forEach((Table) => {
            objectStore.add(Table.innerHTML);//Doesn't seem to work as it should
        });
    };
};

//Uncaught ReferenceError: db is not defined
const transaction = db.transaction(["Table"], "readwrite");

// Do something when all the data is added to the database.
transaction.oncomplete = (event) => {
    console.log("All done!");
  };
  
  transaction.onerror = (event) => {
    console.log("Error");
  };
  
  const objectStore = transaction.objectStore("Table");
  array.forEach((Table) => {
    const request = objectStore.add(Table);
    request.onsuccess = (event) => {
      event.target.result === Table.innerHTML;
    };
  });
ycl3bljg

ycl3bljg1#

将数据库从嵌套函数移到顶层。

let db;
request.onupgradeneeded = (event) => {
    db = event.target.result;

}

相关问题