当我尝试使用浏览器当前具有的更高版本升级indexedDB数据库时出现异常, 但有趣的部分是中止,它升级了。这是设计还是我做错了。
我从飞镖样本Todo中获得了很大的启发,所以我的代码最终看起来像这样。
void open_db(String DB_name, int Version, String Store_Name){
var request = window.indexedDB.open(DB_name, Version);
request.on.success.add((e) => _onDbOpened(request.result));
request.on.error.add((e) => print("Error opening db"));
request.on.upgradeNeeded.add((e) => _onUpgradeNeeded(request.transaction, Store_Name));
}
void _onDbOpened(IDBDatabase db){
_db = db;
print("DB opened");
}
void _onUpgradeNeeded(IDBTransaction changeVersionTransaction, String Store_Name){
changeVersionTransaction.on.error.add((e) => print("Error upgrading db"));
changeVersionTransaction.on.complete.add((e) => print("Success upgrading db"));
changeVersionTransaction.db.createObjectStore(Store_Name);
}
当我使用version = 4运行它并且浏览器只有version = 3时,它会按预期跳转到_onUpgradeNeeded,但是我得到一个带有消息的IDBDatabaseException:“ConstraintError:DOM IDBDatabase Exception 4”。
那么我哪里出错?
答案 0 :(得分:0)
感谢您的提问!
您可能需要先检查商店是否存在。
if (db.objectStoreNames.indexOf(storeName) == -1) {
db.createObjectStore(storeName);
}
以下是使用Dart更新IndexedDB数据库的一些代码。请注意,这可以补偿两种升级方式(Chrome使用的旧方式,以及Firefox和较新版Chrome使用的新方式)
_openDb(afterOpen()) {
var request = window.indexedDB.open(DB_NAME, VERSION);
if (request is IDBOpenDBRequest) {
// New upgrade protocol. FireFox 15, Chrome 24, hopefully IE10.
request.on.success.add(expectAsync1((e) {
db = e.target.result;
afterOpen();
}));
request.on.upgradeNeeded.add((e) {
guardAsync(() {
_createObjectStore(e.target.result);
});
});
request.on.error.add(fail('open'));
} else {
// Legacy setVersion upgrade protocol. Chrome < 23.
request.on.success.add(expectAsync1((e) {
db = e.target.result;
if (db.version != '$VERSION') {
var setRequest = db.setVersion('$VERSION');
setRequest.on.success.add(
expectAsync1((e) {
_createObjectStore(db);
var transaction = e.target.result;
transaction.on.complete.add(
expectAsync1((e) => afterOpen()));
transaction.on.error.add(fail('Upgrade'));
}));
setRequest.on.error.add(fail('setVersion error'));
} else {
afterOpen();
}
}));
request.on.error.add(fail('open'));
}
}
_createObjectStore(db) {
try {
// Nuke object store if it already exists.
db.deleteObjectStore(STORE_NAME);
}
on IDBDatabaseException catch(e) { } // Chrome
on DOMException catch(e) { } // Firefox
db.createObjectStore(STORE_NAME);
}
请注意,此代码来自此测试:http://code.google.com/p/dart/source/browse/trunk/dart/tests/html/indexeddb_3_test.dart