浏览器数据库存储有内联键和自动生成键的区别IndexDB

原创
09/11 11:46
阅读数 45

内联键就是传入的对象中包含key值,指定一个属性作为key;自动生成键则是不传入key值,存储的对象中不指定属性作为key,浏览器会自动为存储内容生成键,一般是自动增长的index。

如果尝试向一个使用内联键(in-line keys)的对象存储中添加数据,就会报错:

DataError: Failed to execute 'add' on 'IDBObjectStore': The object store uses in-line keys and the key parameter was provided.

为内联键数据库提供键参数,这是不允许的。在 IndexedDB 中,内联键意味着对象存储使用对象的一个属性作为键,而不是自动生成键。

如果使用内联键,不需要在 add 方法中提供键,因为 IndexedDB 会自动从对象的一个属性中提取键。如果使用自动生成键,则可以在 add 方法中提供一个键。

内联键和自动生成键的区别就是,内联键指定了对象属性作为键值,而自动生成键则是交给系统自动处理键值。

使用内联键的例子

如果你的对象存储使用内联键,你的数据对象应该包含一个特定的属性作为键。例如,如果你的对象存储的键路径是 "id",你的数据对象应该像这样:

const data = { id: 'myKey', name: 'Kimi', age: 30 };

然后,你可以这样添加数据:

function addDataToStoreWithInlineKeys(dbName, storeName, data) {
    return openDatabase(dbName, storeName).then((db) => {
        return new Promise((resolve, reject) => {
            const transaction = db.transaction([storeName], "readwrite");
            const objectStore = transaction.objectStore(storeName);

            const request = objectStore.add(data);

            request.onsuccess = function () {
                resolve("Data added successfully");
            };

            request.onerror = function (event) {
                reject(event.target.error);
            };
        });
    });
}

// 使用示例
addDataToStoreWithInlineKeys('myDatabase', 'myStore', { id: 'myKey', name: 'Kimi', age: 30 })
    .then((message) => console.log(message))
    .catch((error) => console.error(error));

使用自动生成键的例子

如果你的对象存储使用自动生成键,你不需要在添加数据时提供键。例如:

function addDataToStoreWithAutoIncrementKeys(dbName, storeName, data) {
    return openDatabase(dbName, storeName).then((db) => {
        return new Promise((resolve, reject) => {
            const transaction = db.transaction([storeName], "readwrite");
            const objectStore = transaction.objectStore(storeName);

            const request = objectStore.add(data);

            request.onsuccess = function () {
                resolve("Data added successfully");
            };

            request.onerror = function (event) {
                reject(event.target.error);
            };
        });
    });
}

// 使用示例
addDataToStoreWithAutoIncrementKeys('myDatabase', 'myStore', { name: 'Kimi', age: 30 })
    .then((message) => console.log(message))
    .catch((error) => console.error(error));

在这种情况下,IndexedDB 会自动为每个添加的记录生成一个唯一的键。

检查对象存储的键模式

如果你不确定你的对象存储是使用内联键还是自动生成键,你可以检查创建对象存储时的代码。例如,使用内联键的对象存储可能是这样创建的:

const request = indexedDB.open(dbName);
request.onupgradeneeded = function (event) {
    const db = event.target.result;
    db.createObjectStore(storeName, { keyPath: 'id' });
};

而使用自动生成键的对象存储可能是这样创建的:

const request = indexedDB.open(dbName);
request.onupgradeneeded = function (event) {
    const db = event.target.result;
    db.createObjectStore(storeName, { autoIncrement: true });
};

确保你的代码与对象存储的键模式相匹配。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部