Я пытаюсь создать действительно простую IndexedDB с некоторым JavaScript, но он уже терпит неудачу в обработчике on. По-видимому, браузер (Chrome 57) не может разобрать keyPath
(в Основные понятия а>) моего хранилища.
Я следую более или менее этим простым примерам: MDN или Opera-Dev.
Предположим, я хочу хранить такие объекты в БД:
{
"1": 23, // the unique id
"2": 'Name',
"3": 'Description',
"4": null,
"5": null
}
Вот код:
var sStoreNodes = 'nodes';
var sIdFieldNode = '1'; // the important part
// event is fired for creating the DB and upgrading the version
request.onupgradeneeded = function(event)
{
var db = event.target.result;
// Create an objectStore for nodes. Unique key should be the id of the node, on property 1.
// So ID will be the key!
var objectStore = db.createObjectStore(
sStoreNodes,
{
// changing to a plain string works, if it is a valid identifier and not just a strigified number
'keyPath' : [ sIdFieldNode ],
'autoIncrement' : false // really important here
});
};
Сообщение об ошибке выглядит так:
Uncaught DOMException: не удалось выполнить «createObjectStore» для «IDBDatabase»: параметр keyPath не является допустимым путем к ключу. в IDBOpenDBRequest.CCapIndexedDB.request.onupgradeneeded
Я также могу попытаться пропустить ключевой путь, но мне интересно, почему это происходит, и хочу ли я что-то с этим сделать, если мне действительно нужно использовать (сложный) ключевой путь.
Относительно спецификации:
Я не уверен, можно ли здесь применить это:
Значение считается допустимым ключом, если оно относится к одному из следующих типов ECMAScript [ECMA-262]: числовое примитивное значение, строковое примитивное значение, объект Date или объект Array.
и что на самом деле означает это:
Если ключевой путь является DOMString, значение [для получения ключевого пути] будет DOMString, равным ключевому пути. Если ключевой путь представляет собой последовательность, значением будет новый массив, заполненный добавлением строк, равных каждой DOMString в последовательности.
Изменить Это работает, если вы используете не строковое число, а строку, которая является допустимым идентификатором (начинается с символа [a-zA-Z]). Так что 'keyPath' : 'b'
в порядке. Я думаю, это потому, что это значение используется для создания путей, таких как a.b.c
.