内联键就是传入的对象中包含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 });
};
确保你的代码与对象存储的键模式相匹配。