IndexedDB keyPath где-то глубоко в объекте? - PullRequest
1 голос
/ 02 марта 2011

Когда вы создаете objectStore или index в IndexedDB, вы указываете «keyPath», который говорит, где в вашем объекте искать значение, которое должно быть ключом в хранилище или индексе.У меня есть объекты, которые выглядят так:

{doc:{id:4}}

Можно ли мне указать keyPath, который получит этот идентификатор?Я попытался расставить точки (keyPath = "doc.id"), но это не сработало.Нужно ли копировать все мои возможные ключи в верхний слой моих объектов?

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

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

Chrome 12 работает, как описано.Я не смог заставить Firefox 4.0 или 5.0 вести себя таким образом, и подозреваю, что это ошибка в их реализации (иначе спецификация отличалась, когда они это реализовали).

Firefox 4.0 - 5.0 ДЕЛАЕТ правильноразбирать ключевой путь, если он не содержит периодов.Как вы говорите, это означает, что у вас должны быть ключи на верхнем уровне вашего объекта, если вы хотите, чтобы он работал в Firefox.

Вот пример рабочего кода (для Chrome 12 и Firefox 4.0 - 5.0), который иллюстрируетразница:

(function () {

    var db, idb = window.mozIndexedDB || window.webkitIndexedDB;

    idb.open("test").onsuccess = function (ev) {
        db = ev.target.result;
        db.setVersion("1.0").onsuccess = setUpDatabase;
    };

    function setUpDatabase(ev) {
        var x, store;

        for (x = 0; x < db.objectStoreNames.length; x += 1) {
            db.deleteObjectStore(db.objectStoreNames[x]);
        }

        var store = db.createObjectStore("test", {
            keyPath: (window.mozIndexedDB) ? 'moz' : 'doc.webKit'
        });

        store.add({ moz: 1, doc: { webKit: 3, name: 'webkit!'  }});
        store.add({ moz: 3, doc: { webKit: 1, name: 'mozilla!' }});

        // Wait for the setVersion transaction to end...
        // This is an example. Typically control would return to the
        // event loop after this point.
        window.setTimeout(getSomeValue, 1000);
    };

    function getSomeValue() {
        db.transaction("test").objectStore("test").get(3).onsuccess = showValue;
    }

    function showValue(ev) {
        var value = ev.target.result.doc;
        alert('name: ' + value.name);
        // Don't forget to close your connections!
        db.close();
    }

}());
0 голосов
/ 27 июня 2012

В первоначальной реализации IndexedDB в Firefox это не сработало правильно, как вы обнаружили.

Однако к настоящему времени это исправлено довольно давно, поэтому вы сможете использовать его без проблем..

...