Indexeddb在同一索引上搜索多个值

时间:2015-06-09 16:01:49

标签: javascript html5 indexeddb

我在IndexedDB数据库中记录了一个JSON流,我不能在同一个索引上搜索几个值的相等性。

我的数据:

datas = [
  {name : 'Test P1', location : 'P1'},
  {name : 'Test P1', location : 'P1'},
  {name : 'Test P2', location : 'P2'},
  {name : 'Test P2', location : 'P2'},
  {name : 'Test P3', location : 'P3'},
  {name : 'Test P3', location : 'P3'},
  {name : 'Test P3', location : 'P3'}
]

数据库构建和请求:

// In onupgradeneeded
var objectStore = db.createObjectStore('entreprises', {keyPath: 'id_loc'});
objectStore.createIndex("name", "name");
objectStore.createIndex("location", "location");


//In query section
var transaction = db.transaction('entreprises','readonly');
var store = transaction.objectStore('entreprises');
var index = store.index('location');
// I want select only records where location = P1 and location = P2
var request = index.openCursor(IDBKeyRange.only(['P1', 'P2']));
// Select the first matching record
var request = index.get(IDBKeyRange.only(['P1', 'P2']));

查询找到我的任何记录。有可能吗?谢谢。

3 个答案:

答案 0 :(得分:1)

我怀疑你是否可以使用only()的数组,API也没有这么说,请查看下面的IDBKeyRange.only()
可能这就是它不适合你的原因。

  

IDBKeyRange接口的only()方法创建一个新的键范围   包含单个值。

因此,你可以做的是打开“P1”或“P2”的光标(以较少的行数为准),然后循环游标以检查它是否包含其他所需的值。下面是我为您的方便参考创建的示例,因此请根据删除硬编码值(如“位置”,“P1”,“P2”等)进行调整。

var resultArr = [];
var keyRange = IDBKeyRange.only("P1");
cursorHandler = indexHandler.openCursor(keyRange);

cursorHandler.onerror = function(event) {
    if (errorCallBack && typeof(errorCallBack) == 'function') {
        errorCallBack(event);
    }
};

cursorHandler.onsuccess = function(event) {
    var cursor = event.target.result;
    if (cursor) {
        if(cursor.value != null && cursor.value != undefined){
            if(cursor.value["location"] == "P2"){
                resultArr.push(cursor.value);
            }
         }
        cursor["continue"]();
    } else{
        var resultObj = {"rows" : resultArr};
        if (successCallBack && typeof(successCallBack) == 'function') {
            successCallBack(resultObj);
        }
    }
    return;
};

答案 1 :(得分:1)

通过为每个查询创建游标

来使用multi-query technique
index.get(IDBKeyRange.only('P1')).onsuccess = cursorHandler;
index.get(IDBKeyRange.only('P2')).onsuccess = cursorHandler;

cursorHandler应该按主键将结果存储在已排序的数组中。

答案 2 :(得分:0)

也许尝试这样的事情:

// ...
objectStore.createIndex('locIndex',['loc1','loc2']);`
// ...
var index = store.index('locIndex');
var request = index.openCursor(IDBKeyRange.only(['P1', 'P2']));