我在Indexeddb中保存了一些记录,我的数据库中的一个字段是" modifieddate"。我想得到修改日期不为空的所有记录的计数。 我可以像这样计算我数据库中的所有记录:
var request = store.count();
我尝试过这样的事情:
var myIndex = store.index('modifiedDate');
var cts = myIndex.count();
但那不起作用。有什么想法吗?
答案 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);
}