获取 Indexeddb 中未保存记录的数量

Getting count of unsaved records in Indexeddb

我在 Indexeddb 中保存了一些记录,我的数据库中的字段之一是 "modifieddate"。我想计算修改日期不为空的所有记录。 我可以像这样计算数据库中的所有记录:

 var request = store.count();

我试过这样的事情:

  var myIndex = store.index('modifiedDate');
                    var cts = myIndex.count();

但这不起作用。有什么想法吗?

获取索引计数应该可行。确保您没有为从未修改过的对象设置 modifiedDate。如果 modifiedDate 属性 未定义、为空或在对象的属性集中不存在,则索引将不包含该对象,导致只有具有已定义 modifiedDate 属性 的对象被包含在modifiedDate 索引,这导致计数 returning 属性 数字。

第二个问题是您如何使用计数函数。 IDBObjectStore.count 和 IDBIndex.count return 一个 IDBRequest 对象,而不是一个数字。您必须异步获取计数。这可以使用回调函数轻松完成。

var countRequest = myIndex.count();
countRequest.onsuccess = function(event) {
  var theActualCountNumber = event.target.result;

  // Alternatives to above statement, use whatever you like
  // var theActualCountNumber = countRequest.result;
  // var theActualCountNumber = this.result;

  console.log('Number of objects with a modifiedDate property: ',
    theActualCountNumber);
};

您不能 return 'theActualCountNumber' 回调函数中的变量值。它仅在函数内定义和访问。因此,无论什么代码想要在获得计数值后使用它,都必须位于 函数本身内。使代码更清晰、更易于使用的简单技巧如下:

function countModified(db, callback) {
  var tx = db.transaction('mystore');
  var store = tx.objectStore('mystore');
  var index = store.index('modifiedDate');
  var request = index.count();
  request.onsuccess = function(event) {
    var count = event.target.result;
    callback(count);
  };
}

// An example of how to call it
var openRequest = indexedDB.open('mydb', myversion);
openRequest.onsuccess = function(event) {
  var db = event.target.result;
  countModified(db, onGetCountModified);
};

function onGetCountModified(count) {
  console.log('There are %s modified objects', count);
}