Есть ли способ получить только верхнюю строку в IndexedDB? Я ничего не мог найти для этого.Как получить Top 1 ряд от IndexedDB
ответ
Поскольку я не мог найти что-нибудь, так это то, что я поставил на место теперь, и он отлично работает для моей цели. Это взломать, и я не доволен этим, но эй, пока это будет.
Я просто храню одну строку, которая мне нужна в этой базе данных. И при чтении я получаю все строки и выполняю требуемое действие, которое есть только одна строка. Когда я вставляю новую строку, я просто очищаю всю базу данных, которая снова является только одной строкой и вставляет в нее новую строку.
@spiderdevil, я только что видел ваш ответ и не уверен, смогу ли я попытаться прервать транзакцию, но если это сработает для кого-то еще, обязательно разделите его в комментариях.
Вид взлома, но я считаю, что если вы не назовете continue() на объекте результата, он обработает только первый элемент.
Ниже приведен краткий пример запроса с помощью курсора и обработки только одного результата.
var db = _IndexedDatabase;
var trans = db.transaction(["Sites"], IDBTransaction.READ_ONLY);
var store = trans.objectStore("Sites");
var request = store.openCursor();
request.onsuccess = function (e)
{
var result = e.target.result;
if(!!result == false) { return; }
// Use result.value some how
// Comment out this line to process the first item only
//result.continue();
};
Вы можете использовать Transaction.abort()
Например, если с помощью @ примера Шон
var db = _IndexedDatabase;
var trans = db.transaction(["Sites"], IDBTransaction.READ_ONLY);
trans.onabort = function(event) {
console.log(event);
};
var store = trans.objectStore("Sites");
var request = store.openCursor();
request.onsuccess = function (ev)
{
var cursor = request.result || ev.target.result;
if(!!cursor == false)
return;
console.log(cursor.value);
try{
transaction.abort();
}catch(e){
console.log(e);
}
};
Использование курсора и не вызов .continue() не является хаком вообще. Это намеченный путь. В основном из указателей курсоров именно то, что они позволяют вам получать только необходимую информацию.
Так что не надо называть transaction.abort()
Просто используйте метод Get по индексу. Это вернет первую запись для данного ключа, только неудобство вы не можете сортировать.
Я сделал именно это, и это работает на данный момент, но когда вы пытаетесь закрыть дополнение Chrome (мне нужно было использовать его в надстройке), весь браузер Chrome выйдет из строя на вас. – strider
У Chrome было несколько проблем, в которых использование IndexedDB привело бы к краху всего браузера. Я сделал [дефект] (http://code.google.com/p/chromium/issues/detail?id=108871) в команде Chrome, и я считаю, что он исправлен (по крайней мере, в dev-версии) , Повторите попытку своего кода в dev или канареечной версии Chrome или в Firefox, поскольку он, кажется, всегда работает. – Shawn