2016-03-15 3 views
0

Я рассмотрел другие подобные вопросы. Мой случай отличается от того, что я вставляю простые объекты json без ключей, без автоматического увеличения.IndexedDB - DataError: данные, предоставленные операции, не отвечают требованиям

Вот та часть, которая делает вставку:

function insertInto(model, data, successCallback) { 
    console.log("inserting into model "+model); 
    var transaction = db.transaction([model], IDBTransaction.READ_WRITE || 'readwrite'); 
    var store, i, request; 
    var total = data.length; 

    function successCallbackInner() { 
     total = total - 1; 
     if (total === 0) { 
      successCallback(); 
     } 
    } 
    transaction.onerror = indexedDBError; 
    store = transaction.objectStore(model); 
    for (i in data) { 
     if (data.hasOwnProperty(i)) { 
      console.log(data[i]); 
      request = store.add(data[i]); 
      request.onsuccess = successCallbackInner; 
      request.onerror = indexedDBError; 
     } 
    } 
} 

Ошибка является DataError: Data provided to an operation does not meet requirements.

При входе в систему данные, которые я пытаюсь вставить его подтверждает мой объект является простым объектом с тремя параметрами строки : Object { cooked="well done", cheese="provolone", toasted="no"}

Вот jsFiddle с полным тестовым кодом.

Все предложения приветствуются. Даже «попробуйте» ответы. Я пытался понять это со вчерашнего утра.

Спасибо

ответ

3

Если вы попробуете его в Chrome вы увидите более информативное сообщение об ошибке:

DataError: Failed to execute 'add' on 'IDBObjectStore': The object store uses out-of-line keys and has no key generator and the key parameter was not provided.

В jsfiddle ваш объект хранит создаются с db.createObjectStore(modelData[i].name, {autoIncrement: false});, что означает (1) есть нет ключа (keyPath опция отсутствует), и (2) генератор ключей отсутствует (autoIncrement опция ложна). Это означает, что (1) ключи не вытягиваются из значения, и (2) магазин не будет генерировать ключи для вас. Поэтому вам нужно указать ключи при вызове add() или вы получите это исключение.

Несколько примеров:

// out-of-line keys, no key generator 
var s1 = db.createObjectStore('s1'); 
s1.add(value, "my_key"); // key will be "my_key" 

// out-of-line keys, key generator 
var s2 = db.createObjectStore('s2', {autoIncrement: true}); 
s2.add(value); // key will be 1 
s2.add(value, 123); // key will be 123 
s2.add(value); // key will be 124 

// in-line keys, no key generator 
var s3 = db.createObjectStore('s3', {keyPath: 'id'}); 
s3.add({id: 123}); // key will be 123 

// in-line keys, key generator 
var s4 = db.createObjectStore('s4', {keyPath: 'id', autoIncrement: true}); 
s4.add({}); // key will be 1 (and inserted into record) 
s4.add({id: 123}); // key will be 123 
s4.add({}); // key will be 124 (and inserted into record) 

Случаи, не показанные бы бросить DataError исключение.

+0

Удивительный! я не понимал, что нужен ключ ... не могу дождаться, чтобы реализовать это завтра. Заметьте себе: https://jsfiddle.net/neu7wa5n/1/ –

Смежные вопросы