IndexedDB - DataError:提供给操作的数据不符合要求

时间:2016-03-15 16:25:36

标签: javascript indexeddb

我看过其他类似的问题。我的情况不同,因为我插入没有键的简单json对象,没有自动增量。

以下是插入的部分:

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

赞赏任何和所有建议。甚至“试试这个”回复。我从昨天早上起就试图解决这个问题。

谢谢

1 个答案:

答案 0 :(得分:6)

如果您在Chrome中试用它,您会看到更多信息错误:

  

DataError:无法在'IDBObjectStore'上执行'add':对象存储使用外线键并且没有密钥生成器,并且未提供密钥参数。

在jsfiddle中,您的对象存储正在使用SELECT recordID, groupID FROM ( SELECT recordID, groupID, RAND() AS rnd, ROW_NUMBER() OVER(PARTITION BY groupID ORDER BY rnd) AS pos FROM yourTable ) WHERE pos <= 100 ORDER BY groupID, recordID 创建,这意味着(1)没有关键路径(db.createObjectStore(modelData[i].name, {autoIncrement: false});选项不存在),以及(2)没有密钥生成器( keyPath选项为false)。这意味着(1)不从值中拉出键,(2)商店不会为您生成键。因此,您需要在调用autoIncrement时指定密钥,否则您将获得该异常。

一些例子:

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) 例外。