IDBKeyRange.only在IE中的复合索引上

时间:2014-11-29 16:42:36

标签: indexeddb

我有以下代码:

    this.getChildren = function (db, parentId, foldersOnly, callback, finishedCallback) {
    var transaction = db.transaction("tree", "readonly");
    var objectStore = transaction.objectStore("tree");

    var handleResult = function (event) {
        var cursor = event.target.result;
        if (cursor) {
            callback(cursor.primaryKey, cursor.value);
            cursor.continue();
        } else {
            finishedCallback();
        }
    };

    if (foldersOnly) {
        // Only find records with the correct parentId and IsFolder == 1
        var range = IDBKeyRange.only([parentId, 1]);
        var index = objectStore.index('ParentId IsFolder');
        index.openCursor(range).onsuccess = handleResult;
    } else {
        var range = IDBKeyRange.only(parentId);
        var index = objectStore.index('ParentId');
        index.openCursor(range).onsuccess = handleResult;
    }
};

如果foldersOnly为false,则它适用于所有浏览器。但如果我传入真实,那么它在IE中不起作用。我只是得到了数据错误'回来。

我也试过

var range = IDBKeyRange.bound([parentId, 1], [parentId, 1]);

有人有任何建议吗?

编辑:

这些是索引的创建方式:

 treeObjectStore.createIndex("ParentId", "ParentId", { unique: false });
 treeObjectStore.createIndex("ParentId IsFolder", ['ParentId', 'IsFolder'], { unique: false });

2 个答案:

答案 0 :(得分:4)

IE不支持复合索引。

编辑:

要解决此问题,请尝试在对象中创建单个属性,并在此属性上创建单个索引。在你的情况下,尝试像路径&#39 ;?您必须使所有bizlogic周围的添加/更新复杂化,确保每次更新此派生字段,但至少它可以工作。

例如,尽管很烦人,但要创建一个派生的字符串属性,其中包含每个对象的值:ParentId +':' +(IsFolder?' 1':' 0')。

答案 1 :(得分:4)

IE有一个新的polyfill,它的行为与标准相似:

https://github.com/dfahlander/idb-iegap