2012-11-28 3 views
3

Я получаю исключение, когда пытаюсь обновить мою базу данных indexedDB с более высокой версией, чем в настоящее время браузер, , но смешная часть прерывания - это то, что она обновляется. Это по дизайну или я сделал что-то неправильно.Исключение 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); 
} 

Когда я запускаю это с версией = 4 и браузер только версия = 3, то она переходит к _onUpgradeNeeded, как и ожидалось, но я получаю IDBDatabaseException с сообщением: «ConstraintError: DOM Exception IDBDatabase 4».

Так где же я ошибаюсь?

+0

Это Dartium или dart2js? –

+0

Я использую Дартиум. –

+0

Помог ли ответ ниже? Все еще в беде? –

ответ

0

Спасибо за ваш вопрос!

Возможно, вам потребуется проверить, существует ли магазин в первую очередь.

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

Ниже приведен код для обновления базы данных IndexedDB с использованием Dart. Заметим, что это компенсирует два способа модернизации (старый способ, который 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

+0

Ну, я получаю исключение, но теперь это просто попытка, но спасибо за код для управления старыми броузерами. –

Смежные вопросы