如何从索引数据库获取所有值

How to get all values from indexeddb

本文关键字:获取 数据库 索引      更新时间:2023-09-26

我正在努力在indexedDb中存储一些数据。

我创建了一个将数据保存到索引数据库中的方法。我存储了 49 条记录。我正在尝试检索所有这些。我编写了以下代码来获取值。我的 js 文件中除了这一行之外没有其他代码。

function crap() {
var indexedDb = window.indexedDB || window.webkitIndexedDB || window.msIndexedDB;
var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;
var openedDb = indexedDb && indexedDb.open;
var isIndexDbTransactionPossible = window.IDBTransaction || window.webkitIDBTransaction;
if (isIndexDbTransactionPossible) {
    isIndexDbTransactionPossible.READ_WRITE = isIndexDbTransactionPossible.READ_WRITE || 'readwrite';
    isIndexDbTransactionPossible.READ_ONLY = isIndexDbTransactionPossible.READ_ONLY || 'readonly';
}
var request = indexedDb.open('Offline', DB_VERSION);
request.onupgradeneeded = function(e) {
    var db = e.target.result;
    if (db.objectStoreNames.contains('tab')) {
        db.deleteObjectStore('tab');
    }
    var store = db.createObjectStore('tab', {keyPath: 'id', autoIncrement: true});
};
request.onsuccess = function(e) {
    console.log("DB opened");
    var db = e.target.result;
    var store= db.transaction('tab', IDBTransaction.READ_ONLY).objectStore('tab');
    var cursor = store.openCursor();
    cursor.onsuccess = function(event) {
        var c = event.target.result;
        if (c) {
            console.log("New value")
            c.continue();
        }
    };
};
}

我看到"新价值"打印了124次。我不确定为什么 cursor.continue() 在第 49 次尝试后没有返回 null。任何帮助都非常感谢。

我很肯定这种方法不会多次调用。"数据库已打开"仅记录一个。

只需使用 getAll 函数:

    var allRecords = store.getAll();
    allRecords.onsuccess = function() {
        console.log(allRecords.result);
    };

在文档中阅读更多内容:使用 IndexedDB

无需检查 readyState,只需检查游标请求回调中是否定义了游标。下面是一个示例。为了清楚起见,我稍微修改了变量的名称。

cursorRequest.onsuccess = function(event) {
  var cursor = event.target.result;
  if(cursor) {
    var value = cursor.value;
    console.log('New value:', value);
    cursor.continue();
  } else {
    // Undefined cursor. This means either no objects found, 
    // or no next object found
    // Do not call cursor.continue(); in this else branch because 
    // there are no more objects over which to iterate.  
    // Coincidentally, this also means we are done iterating.
    console.log('Finished iterating');
  }
}