2012-01-06 3 views

ответ

0

Поскольку я не мог найти что-нибудь, так это то, что я поставил на место теперь, и он отлично работает для моей цели. Это взломать, и я не доволен этим, но эй, пока это будет.

Я просто храню одну строку, которая мне нужна в этой базе данных. И при чтении я получаю все строки и выполняю требуемое действие, которое есть только одна строка. Когда я вставляю новую строку, я просто очищаю всю базу данных, которая снова является только одной строкой и вставляет в нее новую строку.

@spiderdevil, я только что видел ваш ответ и не уверен, смогу ли я попытаться прервать транзакцию, но если это сработает для кого-то еще, обязательно разделите его в комментариях.

0

Вид взлома, но я считаю, что если вы не назовете 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(); 
}; 
+0

Я сделал именно это, и это работает на данный момент, но когда вы пытаетесь закрыть дополнение Chrome (мне нужно было использовать его в надстройке), весь браузер Chrome выйдет из строя на вас. – strider

+0

У Chrome было несколько проблем, в которых использование IndexedDB привело бы к краху всего браузера. Я сделал [дефект] (http://code.google.com/p/chromium/issues/detail?id=108871) в команде Chrome, и я считаю, что он исправлен (по крайней мере, в dev-версии) , Повторите попытку своего кода в dev или канареечной версии Chrome или в Firefox, поскольку он, кажется, всегда работает. – Shawn

1

Вы можете использовать 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); 
    } 
}; 
6

Использование курсора и не вызов .continue() не является хаком вообще. Это намеченный путь. В основном из указателей курсоров именно то, что они позволяют вам получать только необходимую информацию.

Так что не надо называть transaction.abort()

0

Просто используйте метод Get по индексу. Это вернет первую запись для данного ключа, только неудобство вы не можете сортировать.