如何获取具有最高时间戳值的 x 个对象?
How to obtain x objects with highest timestamp value?
我是网络应用程序开发的新手,我找不到以下问题的解决方案。基本上,我试图从 IndexedDB 数据库中对最新对象的数组进行排序。每个对象都包含一个时间戳值。我已经在时间戳上创建了一个索引,并且我能够获得具有最高值的对象。
function getMails (numberOfMessages, _function) {
/* This function uses asynchronous methods, hence you have to pass the key and function that will receive
the messageitem as a parametr */
if (typeof optionalArg === 'undefined') {
optionalArg = 10;
}
function _getMails (db) {
var transaction = db.transaction(["MessageItem"], "readonly");
var store = transaction.objectStore("MessageItem");
var index = store.index("timestamp");
var cursor = index.openCursor(null, 'prev');
var maxTimestampObject = null;
cursor.onsuccess = function(e) {
if (e.target.result) {
maxTimestampObject = e.target.result.value;
_function(maxTimestampObject);
}
};
}
openDB(_getMails);
}
函数 openDB 打开数据库并将 db 对象作为参数传递给 _getMails 函数。函数 getMails 目前只传递具有最高时间戳值的对象。我可以遍历数据库 x(numberOfMessages) 次并始终 select 具有最高时间戳的对象,同时排除我试图获取的数组中已经存在的对象。但我不确定这是否是最方便的方法。谢谢你的回复。一月
你只需要在onsuccess
函数中调用cursor.continue()
。它将使用下一个游标结果再次调用。
谢谢觉吞。这是我给感兴趣的人的最终代码:
function openDB(_function) {
// Opening the DB
var openRequest = indexedDB.open("TsunamiDB",1);
openRequest.onupgradeneeded = function(e) {
console.log("Upgrading...");
var thisDB = e.target.result;
if (!thisDB.objectStoreNames.contains("MessageItem")) {
var objectStore = thisDB.createObjectStore("MessageItem");
objectStore.createIndex("timestamp", "envelope.timestamp", {unique:false});
}
}
openRequest.onsuccess = function(e) {
console.log("Success!");
_function(e.target.result);
}
openRequest.onerror = function(e) {
console.log("Error");
console.dir(e);
}}
此函数使用异步方法,因此您必须传递将接收 messageitem 作为参数的键和函数。
Pareametr 是 x(numberOfMessages) 条最新消息的数组。该数组已排序,因此索引为 0 的消息是最新的。
function getMails ( _function, numberOfMessages) {
if (typeof numberOfMessages === 'undefined') {
numberOfMessages = 10;
}
function _getMails (db) {
var transaction = db.transaction(["MessageItem"], "readonly");
var store = transaction.objectStore("MessageItem");
var index = store.index("timestamp");
var objectsArray = [];
var i = 0;
index.openCursor(null, 'prev').onsuccess = function(e) {
var cursor = e.target.result;
if (cursor && i < numberOfMessages) {
objectsArray.push(cursor.value)
++i;
cursor.continue();
}
};
transaction.oncomplete = function(e) {
_function(objectsArray);
}
}
openDB(_getMails);}
我是网络应用程序开发的新手,我找不到以下问题的解决方案。基本上,我试图从 IndexedDB 数据库中对最新对象的数组进行排序。每个对象都包含一个时间戳值。我已经在时间戳上创建了一个索引,并且我能够获得具有最高值的对象。
function getMails (numberOfMessages, _function) {
/* This function uses asynchronous methods, hence you have to pass the key and function that will receive
the messageitem as a parametr */
if (typeof optionalArg === 'undefined') {
optionalArg = 10;
}
function _getMails (db) {
var transaction = db.transaction(["MessageItem"], "readonly");
var store = transaction.objectStore("MessageItem");
var index = store.index("timestamp");
var cursor = index.openCursor(null, 'prev');
var maxTimestampObject = null;
cursor.onsuccess = function(e) {
if (e.target.result) {
maxTimestampObject = e.target.result.value;
_function(maxTimestampObject);
}
};
}
openDB(_getMails);
}
函数 openDB 打开数据库并将 db 对象作为参数传递给 _getMails 函数。函数 getMails 目前只传递具有最高时间戳值的对象。我可以遍历数据库 x(numberOfMessages) 次并始终 select 具有最高时间戳的对象,同时排除我试图获取的数组中已经存在的对象。但我不确定这是否是最方便的方法。谢谢你的回复。一月
你只需要在onsuccess
函数中调用cursor.continue()
。它将使用下一个游标结果再次调用。
谢谢觉吞。这是我给感兴趣的人的最终代码:
function openDB(_function) {
// Opening the DB
var openRequest = indexedDB.open("TsunamiDB",1);
openRequest.onupgradeneeded = function(e) {
console.log("Upgrading...");
var thisDB = e.target.result;
if (!thisDB.objectStoreNames.contains("MessageItem")) {
var objectStore = thisDB.createObjectStore("MessageItem");
objectStore.createIndex("timestamp", "envelope.timestamp", {unique:false});
}
}
openRequest.onsuccess = function(e) {
console.log("Success!");
_function(e.target.result);
}
openRequest.onerror = function(e) {
console.log("Error");
console.dir(e);
}}
此函数使用异步方法,因此您必须传递将接收 messageitem 作为参数的键和函数。 Pareametr 是 x(numberOfMessages) 条最新消息的数组。该数组已排序,因此索引为 0 的消息是最新的。
function getMails ( _function, numberOfMessages) {
if (typeof numberOfMessages === 'undefined') {
numberOfMessages = 10;
}
function _getMails (db) {
var transaction = db.transaction(["MessageItem"], "readonly");
var store = transaction.objectStore("MessageItem");
var index = store.index("timestamp");
var objectsArray = [];
var i = 0;
index.openCursor(null, 'prev').onsuccess = function(e) {
var cursor = e.target.result;
if (cursor && i < numberOfMessages) {
objectsArray.push(cursor.value)
++i;
cursor.continue();
}
};
transaction.oncomplete = function(e) {
_function(objectsArray);
}
}
openDB(_getMails);}