如何将新的 Objectstore 添加到现有的 indexeddb
How to add a new Objectstore to an existing indexeddb
任何人都可以告诉我如何将新的对象库添加到现有的 indexeddb 实例中,该实例中有一个版本号。当我尝试创建新版本时,现有的对象存储正在被删除。
我有一个版本“1”,它有大约 10 个包含数据的对象存储。当我尝试使用新版本号打开同一个数据库时,我丢失了当前数据和对象存储。
这是我试过的。
var _upRequest = indexedDB.open("employees");
_upRequest.onsuccess = function (e) {
var thisDb = e.target.result;
var version = parseInt(thisDb.version)+1;
thisDb.close();
var openRequest = indexedDB.open("employees", version);
//handle setup, this will be run by Firefox
openRequest.onupgradeneeded = function (e) {
console.log("running onupgradeneeded");
var thisDb = e.target.result;
//Create Employee
if (!thisDb.objectStoreNames.contains("employee")) {
console.log("I need to make the employee objectstore");
var objectStore = thisDb.createObjectStore("employee", { keyPath: "id", autoIncrement: true });
objectStore.createIndex("searchkey", "searchkey", { unique: false });
}
thisDb.close();
}
openRequest.onsuccess = function (e) {
db = e.target.result;
db.onerror = function (e) {
alert("Sorry, an unforseen error was thrown.");
console.log("***ERROR***");
console.dir(e.target);
}
db.close();
}
}
我没有直接的答案,但你目前编写的代码对我来说似乎很奇怪。
我首先要尝试的一件事是正确绑定 onupgradeneeded、onerror,而不是过早关闭数据库。
不要这样做:
var request = indexedDB.open();
request.onsuccess = function() {
request.onupgradeneeded = function() {};
};
改为这样做:
var request = indexedDB.open();
request.onsuccess = function() {};
request.onupgradeneeded = function() {};
同样,立即绑定onerror,而不仅仅是在onupgradeneeded或onsuccess之后,像这样:
var request = indexedDB.open();
request.onsuccess = function() {};
request.onupgradeneeded = function() {};
request.onerror = function() {};
当indexedDB.open检测到更高版本或第一个版本时,它将派发一个upgradeneeded事件,等待隐含的'versionchange'事务完成,并且然后发送成功事件。
我不太明白你的代码。我不确定你为什么要打开一个连接,关闭它,然后打开第二个连接,然后延迟绑定需要升级的处理程序。
这就是添加对象存储然后访问它所需要做的全部工作:
var request = indexedDB.open('name', aNumberGreaterThanTheCurrentVersion);
request.onupgradeneeded = function(event) {
console.log('Performing upgrade');
var db = event.target.result;
console.log('Creating object store');
db.createObjectStore('mystore');
};
request.onsuccess = function(event) {
console.log('Connected to database');
var db = event.target.result;
var tx = db.transaction('mystore');
var store = tx.objectStore('mystore');
console.log('Doing something with store "mystore"');
// ...
console.log('Finished doing something, now closing');
db.close();
};
request.onerror = console.error;
另一个注意事项。 indexedDB 会产生不同类型的错误,区分它们很重要。 request.onerror 并不像您的日志消息所暗示的那样 "throw" 异常。相反,发生的事情是 indexedDB 调度了一个错误事件。已调度的错误事件 不会 抛出。现在,除此之外,indexedDB 的几个函数 可以抛出异常 。这些需要被 try/catch 块捕获。您甚至不会看到已分派的错误事件。您将收到一个实际的脚本错误,该错误会停止执行,并会自动出现在控制台中,并带有一条信息量不大的消息。
let OpenReq = indexedDB.open( 'dbName', version );
OpenReq.onupgradeneeded = function( e )
{
let db = e.target.result;
db.objectStoreNames.contains( "myStore" ) || db.createObjectStore( "myStore" );
}
如果您有版本 1 的现有数据库,运行 上面版本 = 2 的代码将保留现有的商店。
任何人都可以告诉我如何将新的对象库添加到现有的 indexeddb 实例中,该实例中有一个版本号。当我尝试创建新版本时,现有的对象存储正在被删除。
我有一个版本“1”,它有大约 10 个包含数据的对象存储。当我尝试使用新版本号打开同一个数据库时,我丢失了当前数据和对象存储。
这是我试过的。
var _upRequest = indexedDB.open("employees");
_upRequest.onsuccess = function (e) {
var thisDb = e.target.result;
var version = parseInt(thisDb.version)+1;
thisDb.close();
var openRequest = indexedDB.open("employees", version);
//handle setup, this will be run by Firefox
openRequest.onupgradeneeded = function (e) {
console.log("running onupgradeneeded");
var thisDb = e.target.result;
//Create Employee
if (!thisDb.objectStoreNames.contains("employee")) {
console.log("I need to make the employee objectstore");
var objectStore = thisDb.createObjectStore("employee", { keyPath: "id", autoIncrement: true });
objectStore.createIndex("searchkey", "searchkey", { unique: false });
}
thisDb.close();
}
openRequest.onsuccess = function (e) {
db = e.target.result;
db.onerror = function (e) {
alert("Sorry, an unforseen error was thrown.");
console.log("***ERROR***");
console.dir(e.target);
}
db.close();
}
}
我没有直接的答案,但你目前编写的代码对我来说似乎很奇怪。
我首先要尝试的一件事是正确绑定 onupgradeneeded、onerror,而不是过早关闭数据库。
不要这样做:
var request = indexedDB.open();
request.onsuccess = function() {
request.onupgradeneeded = function() {};
};
改为这样做:
var request = indexedDB.open();
request.onsuccess = function() {};
request.onupgradeneeded = function() {};
同样,立即绑定onerror,而不仅仅是在onupgradeneeded或onsuccess之后,像这样:
var request = indexedDB.open();
request.onsuccess = function() {};
request.onupgradeneeded = function() {};
request.onerror = function() {};
当indexedDB.open检测到更高版本或第一个版本时,它将派发一个upgradeneeded事件,等待隐含的'versionchange'事务完成,并且然后发送成功事件。
我不太明白你的代码。我不确定你为什么要打开一个连接,关闭它,然后打开第二个连接,然后延迟绑定需要升级的处理程序。
这就是添加对象存储然后访问它所需要做的全部工作:
var request = indexedDB.open('name', aNumberGreaterThanTheCurrentVersion);
request.onupgradeneeded = function(event) {
console.log('Performing upgrade');
var db = event.target.result;
console.log('Creating object store');
db.createObjectStore('mystore');
};
request.onsuccess = function(event) {
console.log('Connected to database');
var db = event.target.result;
var tx = db.transaction('mystore');
var store = tx.objectStore('mystore');
console.log('Doing something with store "mystore"');
// ...
console.log('Finished doing something, now closing');
db.close();
};
request.onerror = console.error;
另一个注意事项。 indexedDB 会产生不同类型的错误,区分它们很重要。 request.onerror 并不像您的日志消息所暗示的那样 "throw" 异常。相反,发生的事情是 indexedDB 调度了一个错误事件。已调度的错误事件 不会 抛出。现在,除此之外,indexedDB 的几个函数 可以抛出异常 。这些需要被 try/catch 块捕获。您甚至不会看到已分派的错误事件。您将收到一个实际的脚本错误,该错误会停止执行,并会自动出现在控制台中,并带有一条信息量不大的消息。
let OpenReq = indexedDB.open( 'dbName', version );
OpenReq.onupgradeneeded = function( e )
{
let db = e.target.result;
db.objectStoreNames.contains( "myStore" ) || db.createObjectStore( "myStore" );
}
如果您有版本 1 的现有数据库,运行 上面版本 = 2 的代码将保留现有的商店。