如何将新值“放入”已存在的 indexedDB 中已存在的 objectStore 中?
How can I `put` new values in an already existing objectStore in an already existing indexedDB?
我正在努力更新 objectStore
中的一系列四个条目 indexedDB
。
这就是我想要实现的(伪代码):
let myDatabase = indexedDB('myDatabase', 1);
let myObjectStore = myDatabase.myObjectStore;
myObjectStore.entry1 = 'newValue1';
myObjectStore.entry2 = 'newValue2';
myObjectStore.entry3 = 'newValue3';
myObjectStore.entry4 = 'newValue4';
当然,事情并不是那么简单。
我知道我需要使用 put
。但是,尽管尝试了许多方法,但我无法做到更进一步。
我已经在第一次创建indexedDB
时成功地设置和填充了objectStore
:
// SET UP VALUES OBJECT
let valuesObject = {
entry1 : 'a',
entry2 : 'b',
entry3 : 'c',
entry4 : 'd'
};
// SET UP INDEXED DATABASE
const setUpIndexedDatabase = (valuesObject) => {
let database
const databaseVersion = 1;
const databaseName = \'myDatabase\';
const databaseOpenRequest = indexedDB.open(databaseName, databaseVersion);
databaseOpenRequest.onupgradeneeded = () => {
database = databaseOpenRequest.result;
let myObjectStore = database.createObjectStore('myObjectStore');
myObjectStore.transaction.oncomplete = () => {
let objectStoreValues = database.transaction('Values', 'readwrite').objectStore('Values');
const valuesEntries = Object.entries(valuesObject);
for (let i = 0; i < valuesEntries.length; i++) {
objectStoreValues.add(valuesEntries[i][1], valuesEntries[i][0]);
}
}
}
databaseOpenRequest.onsuccess = () => {
database = databaseOpenRequest.result;
// >>> THIS IS THE BIT THAT I NEED TO WRITE <<<
database.close();
}
}
setUpIndexedDatabase(valuesObject);
到目前为止,还不错。如果尚不存在数据库,上面的代码会触发 onupgradeneeded
事件,这会创建 myObjectStore
并用四个键值对填充它。
但是如果数据库确实存在并且已经包含 myObjectStore
,那么我使用 put
编写的每个代码变体都无法更新键的值和 returns 各种错误- 通常完全没有错误。
我只想更新数据库中的值。
我认为问题是当数据库版本保持不变且 onupgradeneeded
未触发时,我不知道如何正确使用 put
。
如果您想更新数据库中已有的值,可以使用以下代码(例如,我正在更新 entry1
条目):
databaseOpenRequest.onsuccess = function(event) {
db = event.target.result;
const objectStore = db.transaction('myObjectStore', 'readwrite').objectStore('myObjectStore');
const request = objectStore.put('e', 'entry1');
request.onerror = function(event) {
// There was an error while updating.
};
request.onsuccess = function(event) {
// The update was successful.
};
}
我正在努力更新 objectStore
中的一系列四个条目 indexedDB
。
这就是我想要实现的(伪代码):
let myDatabase = indexedDB('myDatabase', 1);
let myObjectStore = myDatabase.myObjectStore;
myObjectStore.entry1 = 'newValue1';
myObjectStore.entry2 = 'newValue2';
myObjectStore.entry3 = 'newValue3';
myObjectStore.entry4 = 'newValue4';
当然,事情并不是那么简单。
我知道我需要使用 put
。但是,尽管尝试了许多方法,但我无法做到更进一步。
我已经在第一次创建indexedDB
时成功地设置和填充了objectStore
:
// SET UP VALUES OBJECT
let valuesObject = {
entry1 : 'a',
entry2 : 'b',
entry3 : 'c',
entry4 : 'd'
};
// SET UP INDEXED DATABASE
const setUpIndexedDatabase = (valuesObject) => {
let database
const databaseVersion = 1;
const databaseName = \'myDatabase\';
const databaseOpenRequest = indexedDB.open(databaseName, databaseVersion);
databaseOpenRequest.onupgradeneeded = () => {
database = databaseOpenRequest.result;
let myObjectStore = database.createObjectStore('myObjectStore');
myObjectStore.transaction.oncomplete = () => {
let objectStoreValues = database.transaction('Values', 'readwrite').objectStore('Values');
const valuesEntries = Object.entries(valuesObject);
for (let i = 0; i < valuesEntries.length; i++) {
objectStoreValues.add(valuesEntries[i][1], valuesEntries[i][0]);
}
}
}
databaseOpenRequest.onsuccess = () => {
database = databaseOpenRequest.result;
// >>> THIS IS THE BIT THAT I NEED TO WRITE <<<
database.close();
}
}
setUpIndexedDatabase(valuesObject);
到目前为止,还不错。如果尚不存在数据库,上面的代码会触发 onupgradeneeded
事件,这会创建 myObjectStore
并用四个键值对填充它。
但是如果数据库确实存在并且已经包含 myObjectStore
,那么我使用 put
编写的每个代码变体都无法更新键的值和 returns 各种错误- 通常完全没有错误。
我只想更新数据库中的值。
我认为问题是当数据库版本保持不变且 onupgradeneeded
未触发时,我不知道如何正确使用 put
。
如果您想更新数据库中已有的值,可以使用以下代码(例如,我正在更新 entry1
条目):
databaseOpenRequest.onsuccess = function(event) {
db = event.target.result;
const objectStore = db.transaction('myObjectStore', 'readwrite').objectStore('myObjectStore');
const request = objectStore.put('e', 'entry1');
request.onerror = function(event) {
// There was an error while updating.
};
request.onsuccess = function(event) {
// The update was successful.
};
}