升级IndexedDB时发生Dart异常

时间:2012-11-28 08:25:36

标签: dart

当我尝试使用浏览器当前具有的更高版本升级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”。

那么我哪里出错?

1 个答案:

答案 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