在 indexedDb 中添加多个对象的正确方法?
Correct way to add multiple objects in indexedDb?
我有以下要添加到 indexedDb 的对象数组:
const data = [
{ name: 'abc',
color: 'blue'
},
{ name: 'xyz',
color: 'red'
},
{ name: 'yui',
color: 'black'
}];
现在我创建数据库并将这些数据插入存储中,如下所示:
if (!db.objectStoreNames.contains("people")) {
peopleStore = db.createObjectStore("people", { keyPath: "name" });
peopleStore.createIndex("color", "color", { unique: false });
peopleStore.transaction.oncomplete = function(event) {
data.forEach(function(data) {
operations.add(data);
});
};
}
我已经用 add()
(在 const operations
内)方法定义了一个函数表达式,如下所示:
add: function(data) {
let request = db
.transaction(["people"], "readwrite")
.objectStore("people")
.add(data);
}
所以这是我的问题:
这样是不是每次add()方法都会创建一个新的事务
正在被调用还是在单个事务中插入所有数据?
如果每次都创建一个新的交易,我怎么才能只
1 个事务以提高性能并执行中的所有操作
它只是。我猜我必须创建一个全局变量
事务并对其执行操作(还有其他方法,如 edit()
、delete()
等,它们中的每一个都有一个“request
”变量在它们内部定义一个事务,类似于我上面展示的)。
我应该像这样创建一个全局变量吗:
const globalTrans = db.transaction(["people"], "readwrite").objectStore("people");
- 创建新交易是一项成本高昂的操作吗?
提前感谢大家花时间回复! :)
创建全局变量会产生问题。可能是某个事务正在运行,对于另一个操作,您可能会覆盖它。
例如-
var globalTx;
// let's say you are selecting data from people
globalTx = db.transaction(["people"], "read") // in read access
// and at same time you are inserting data from employee
globalTx = db.transaction(["employee"], "readwrite") // in read write
有很多方法可以解决这个问题-
- 根据场景创建多种方法-
// for single value
function add(data) {
let request = db.transaction(["people"], "readwrite").objectStore("people").add(data);
}
// for multiple value
function addMultiple(datas, callback) {
const tx = db.transaction(["people"], "readwrite");
datas.forEach(data => {
let request = tx.objectStore("people").add(data);
})
tx.oncomplete = function(event) {
callback();
}
};
- 修改函数只接收数组值-
// so now data will be only array
function add(datas, callback) {
const tx = db.transaction(["people"], "readwrite");
datas.forEach(data => {
let request = tx.objectStore("people").add(data);
})
tx.oncomplete = function(event) {
callback();
}
};
// so when want to insert single value , we will call like this.
const value = {
id: 1,
name: 'ujjwal'
}
add([value], () => {
})
希望这能回答您的问题。
我有以下要添加到 indexedDb 的对象数组:
const data = [
{ name: 'abc',
color: 'blue'
},
{ name: 'xyz',
color: 'red'
},
{ name: 'yui',
color: 'black'
}];
现在我创建数据库并将这些数据插入存储中,如下所示:
if (!db.objectStoreNames.contains("people")) {
peopleStore = db.createObjectStore("people", { keyPath: "name" });
peopleStore.createIndex("color", "color", { unique: false });
peopleStore.transaction.oncomplete = function(event) {
data.forEach(function(data) {
operations.add(data);
});
};
}
我已经用 add()
(在 const operations
内)方法定义了一个函数表达式,如下所示:
add: function(data) {
let request = db
.transaction(["people"], "readwrite")
.objectStore("people")
.add(data);
}
所以这是我的问题:
这样是不是每次add()方法都会创建一个新的事务 正在被调用还是在单个事务中插入所有数据?
如果每次都创建一个新的交易,我怎么才能只 1 个事务以提高性能并执行中的所有操作 它只是。我猜我必须创建一个全局变量 事务并对其执行操作(还有其他方法,如
edit()
、delete()
等,它们中的每一个都有一个“request
”变量在它们内部定义一个事务,类似于我上面展示的)。 我应该像这样创建一个全局变量吗:
const globalTrans = db.transaction(["people"], "readwrite").objectStore("people");
- 创建新交易是一项成本高昂的操作吗?
提前感谢大家花时间回复! :)
创建全局变量会产生问题。可能是某个事务正在运行,对于另一个操作,您可能会覆盖它。
例如-
var globalTx;
// let's say you are selecting data from people
globalTx = db.transaction(["people"], "read") // in read access
// and at same time you are inserting data from employee
globalTx = db.transaction(["employee"], "readwrite") // in read write
有很多方法可以解决这个问题-
- 根据场景创建多种方法-
// for single value
function add(data) {
let request = db.transaction(["people"], "readwrite").objectStore("people").add(data);
}
// for multiple value
function addMultiple(datas, callback) {
const tx = db.transaction(["people"], "readwrite");
datas.forEach(data => {
let request = tx.objectStore("people").add(data);
})
tx.oncomplete = function(event) {
callback();
}
};
- 修改函数只接收数组值-
// so now data will be only array
function add(datas, callback) {
const tx = db.transaction(["people"], "readwrite");
datas.forEach(data => {
let request = tx.objectStore("people").add(data);
})
tx.oncomplete = function(event) {
callback();
}
};
// so when want to insert single value , we will call like this.
const value = {
id: 1,
name: 'ujjwal'
}
add([value], () => {
})
希望这能回答您的问题。