2012-11-28 45 views
3

,當我得到一個異常時,我嘗試用更高版本升級我IndexedDB的數據庫,然後在瀏覽器目前, 但有趣的部分中止的是,它得到升級。這是由設計還是我做錯了什麼。飛鏢異常升級IndexedDB的

我非常來自鏢樣品藤的啓發,所以我的代碼最終看上去像這樣。

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異常4」。

因此它在哪兒我去錯了嗎?

+0

這是Dartium還是dart2js? –

+0

我正在使用Dartium。 –

+0

下面的答案有幫助嗎?仍遇到麻煩? –

回答

0

謝謝你的問題!

您可能需要檢查,如果賣場第一存在。

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

以下是使用Dart更新IndexedDB數據庫的一些代碼。請注意,這個補償兩種方式升級(舊的方式,瀏覽器使用,而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

嗯,我仍然得到異常,但現在它只是在嘗試趕上,但感謝代碼來管理舊的瀏覽器。 –