2015-02-17 23 views
6

Projemde tarayıcının dizine eklenmiş DB'sini kullanıyorum ve belirli dds ile db'den bazı nesneleri almak istiyorum. Sonuç alma aralıkları kullanabilirsiniz MDN göre istediğiniz:Indexeddb'den özel kimlikleri alma

MDN'yi göre: sırayla olmayan belirli kimlikleri dizisini almak istiyorsanız

// Only match "Donna" 
var singleKeyRange = IDBKeyRange.only("Donna"); 

// Match anything past "Bill", including "Bill" 
var lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill"); 

// Match anything past "Bill", but don't include "Bill" 
var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Bill", true); 

// Match anything up to, but not including, "Donna" 
var upperBoundOpenKeyRange = IDBKeyRange.upperBound("Donna", true); 

// Match anything between "Bill" and "Donna", but not including "Donna" 
var boundKeyRange = IDBKeyRange.bound("Bill", "Donna", false, true); 

// To use one of the key ranges, pass it in as the first argument of openCursor()/openKeyCursor() 
index.openCursor(boundKeyRange).onsuccess = function(event) { 
    var cursor = event.target.result; 
    if (cursor) { 
    // Do something with the matches. 
    cursor.continue(); 
    } 
}; 

Ancak ne yaparsınız ve tek bir istek ile ardışık değil (örneğin: [91,819,34,24,501])?

cevap

3

Yorumunuza dayanarak, tek bir sorgu (istek) olarak SELECT objects FROM objects WHERE object.id = 1 OR object.id = 2 OR object.id = 5 gibi bir şey yapmak istediğiniz gibi geliyor. Maalesef, indexedDB, OR stil sorgularını (sendikalar) yapamaz. Sadece AND stil sorgularını (kavşaklar) yapabilir.

Almak istediğiniz çeşitli kimlikleri biliniyorsa olası bir çözüm var. Yalnızca bir grup kimliği mülkünü saklayabilir, ilgili kimlikleri ayrı gruplara yerleştirebilir ve ardından grup kimliğine göre sorgulayabilirsiniz. Çakışan almak istediğiniz kimlikler (birden fazla grupta görünür) veya değişkense (grup üyeliği nesnelere sorgudan sorguya değiştiğinde), bu açıkça işe yaramaz.

+0

karışıklık için üzgünüm, ne başarmak istiyorum (5 kayıtları almak için Bu kimlikleri [91,819,34,24,501] ile ancak bir imleci kullanmadan tek bir istek ile. İstediğim kimlikler örneğin [1,2,3,4,5] olsaydı, o zaman "IDBKeyRange.bound" kullanabilirdim, ancak sıralı veya sıralı değillerdi. 91 no'lu kimlikle değil, ID 92 ile nesne istiyorum, sadece ids ile nesneler [91,819,34,24,501] ve işte bu. – Syd

2
Tek bir istekle bunu yapamaz, ancak paralel olarak birden çok istek kapalı atabileceği

:

var keys = [91,819,34,24,501]; 
var results = []; 
keys.forEach(function(key) { 
    store.get(key).onsuccess = function(e) { 
    results.push(e.target.result); 
    if (results.length === keys.length) { 
     // you're done! 
    } 
    }; 
}); 

istekleri sırayla yürütmek için gerekli olduğunu Not, bu nedenle results dizinin sırasını olacak keys dizisinin sırasını eşleştirin. Bir anahtar bulunamazsa, ilgili sonuç endeksi undefined'u içerecektir.

(Endeksli DB doğrudan Bunu desteklemek için bir özellik isteği var. https://github.com/w3c/IndexedDB/issues/19 birlikte henüz kesin API tasarım henüz)

İlgili konular