2015-05-26 57 views
0

我想檢索所有與傳遞的值匹配的值。這就像SQL中的IN操作符。IndexedDB - 檢索給定值中的數據

一個直接的方法是打開遊標(光標指數開),並遍歷值以檢查它是否匹配其中之一,但它會在效率,因爲它需要讀取整個數據存儲。

另一種方法可以通過所有所需的值被循環使用IDBObjectStore.get()對他們後來我不知道,如果它可以高效然後上面的方法。

IDBKeyRange肯定是因爲我想在給定的值,而不是某些上限和下限範圍內不能在這裏幫助。

有什麼想法?

+0

http://stackoverflow.com/questions/25299547 – Josh

回答

0

是的,最好你對性的指標,您可以打開指數的光標。但是你不需要遍歷整個商店 - 只需要你正在尋找的價值。

給出模式是這樣的:

store = db.createObjectStore('records'); 
store.createIndex('by_field1', 'field1'); // implicitly unique:false 

你可以這樣做:

function findValues(passed, callback) { 
    var tx = db.transaction('records'); 
    var store = tx.objectStore('records'); 
    var index = store.index('by_field1'); 

    // accumulate matching records here 
    var results = []; 

    // asynchronously loop over the passed values 
    function nextValue() { 
    if (!passed.length) { 
     // all done! 
     callback(results); 
     return; 
    } 

    // open a cursor matching just the current value we're looking for 
    var value = results.shift(); 
    var request = index.openCursor(IDBKeyRange.only(value)); 
    request.onsuccess = function() { 
     var cursor = request.result; 
     if (!cursor) { 
     nextValue(); 
     } else { 
     results.push(cursor.value); 
     cursor.continue(); 
     } 
    }; 
    } 
    nextValue(); 
} 

這可以通過打開一個光標爲每個傳遞的值和迭代他們都更有效率並行地累積單獨的結果集,然後在所有遊標完成時將它們結合起來。