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

时间:2015-11-25 00:19:48

标签: javascript indexeddb

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

 var request = store.count();

我尝试过这样的事情:

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

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

1 个答案:

答案 0 :(得分:2)

获取索引的计数应该有效。确保没有为从未修改过的对象设置modifiedDate。如果modifiedDate属性未定义,null或在对象的属性集中不存在,则索引将不包括该对象,导致只有具有已定义的modifiedDate属性的对象包含在modifiedDate索引中,导致计算返回属性编号。

第二个问题是你如何使用计数功能。 IDBObjectStore.count和IDBIndex.count返回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);
};

您无法退回' 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);
}