3

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);
}

これをバージョン = 4 で実行し、ブラウザーにバージョン = 3 しかない場合、期待どおりに _onUpgradeNeeded にジャンプしますが、IDBDatabaseException とメッセージ "ConstraintError: DOM IDBDatabase Exception 4" が表示されます。

では、どこが間違っているのでしょうか。

4

1 に答える 1

0

ご質問ありがとうございます。

最初にストアが存在するかどうかを確認する必要がある場合があります。

  if (db.objectStoreNames.indexOf(storeName) == -1) {  
    db.createObjectStore(storeName);
  } 

Dart を使用して IndexedDB データベースを更新するコードを次に示します。これは、アップグレードの 2 つの方法 (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

于 2012-11-29T21:48:43.657 に答える