2012-03-01 24 views
5

kullanılırken bir işlev hatası olmadığında, IndexedDB'nin performansını sınamak için aşağıdaki kodu kullanmaya çalıştım. Kod, http://www.html5rocks.com/en/tutorials/indexeddb/todo/, olarak değiştirilmiştir. Kromda iyi çalışır, ancak Firefox 10'da başarısız olur, "db.setVersion bir işlev değildir". Firefox'ta çalışmasını sağlamak için kodu nasıl değiştirebilirim?Bir "setVersion" öğesi, indexedDB

 var count=0; 
     var MAX=10; 
     var times=3; 
     var allTime; 
     var stime; 
     var etime; 

     var html5rocks = {}; 
     var indexedDB = window.indexedDB || window.webkitIndexedDB || 
         window.mozIndexedDB; 

     if ('webkitIndexedDB' in window) { 
      window.IDBTransaction = window.webkitIDBTransaction; 
      window.IDBKeyRange = window.webkitIDBKeyRange; 
     } 

     html5rocks.indexedDB = {}; 
     html5rocks.indexedDB.db = null; 

     html5rocks.indexedDB.onerror = function(e) { 
      //console.log(e); 
      alert("Why didn't you allow my web app to use IndexedDB?!"); 
     }; 

     html5rocks.indexedDB.open = function(type) { 

     var request = indexedDB.open("todos"); 
      request.onsuccess = function(e) { 
      var v = "1.20"; 
      html5rocks.indexedDB.db = e.target.result; 
      var db = html5rocks.indexedDB.db; 
      // We can only create Object stores in a setVersion transaction; 
      if (v!= db.version) { 

       var setVrequest = db.setVersion(v); 
       // onsuccess is the only place we can create Object Stores 
       setVrequest.onerror = html5rocks.indexedDB.onerror; 
       setVrequest.onsuccess = function(e) { 
        if(db.objectStoreNames.contains("todo")) { 
         db.deleteObjectStore("todo"); 
        } 

        var store = db.createObjectStore("todo", 
         {keyPath: "number"}); 
         addTest(); 
       }; 

      } 
      else addTest(); 
      }; 

      request.onerror = html5rocks.indexedDB.onerror; 

     } 

     html5rocks.indexedDB.addTodo = function(todoText,num) { 
      var db = html5rocks.indexedDB.db; 
      var trans = db.transaction(["todo"], IDBTransaction.READ_WRITE); 
      var store = trans.objectStore("todo"); 

      var data = { 
      "text": todoText, 
      "number": num 
      }; 

      var request = store.put(data); 

      request.onsuccess = function(e) { 
       count++; 
       if(count>=times*MAX) 
       { 
        etime=new Date; 
        var t=document.getElementById('result').innerHTML; 
        document.getElementById('result').innerHTML=t+((etime.valueOf()-stime.valueOf())/times)+"<br/>"; 
        allTime=0;stime=new Date;count=0; 
        getTest(); 
       } 

      }; 

      request.onerror = function(e) { 
      console.log("Error Adding: ", e); 
      }; 
     }; 

     html5rocks.indexedDB.getTodo = function(id) { 
      var db = html5rocks.indexedDB.db; 
      var trans = db.transaction(["todo"], IDBTransaction.READ_WRITE); 
      var store = trans.objectStore("todo"); 

      var request = store.get(id); 

      request.onsuccess = function(e) { 
       count++; 
       if(count>=times*MAX) 
       { 
        etime=new Date; 
        var t=document.getElementById('result').innerHTML; 
        document.getElementById('result').innerHTML=t+((etime.valueOf()-stime.valueOf())/times)+"<br/>"; 
        allTime=0;stime=new Date;count=0; 
        delTest(); 
       } 
      }; 

      request.onerror = function(e) { 
      console.log("Error getting: ", e); 
      }; 
     }; 

     html5rocks.indexedDB.deleteTodo = function(id) { 
      var db = html5rocks.indexedDB.db; 
      var trans = db.transaction(["todo"], IDBTransaction.READ_WRITE); 
      var store = trans.objectStore("todo"); 

      var request = store.delete(id); 

      request.onsuccess = function(e) { 
       count++; 
       if(count>=times*MAX) 
       { 
        etime=new Date; 
        var t=document.getElementById('result').innerHTML; 
        document.getElementById('result').innerHTML=t+((etime.valueOf()-stime.valueOf())/times)+"<br/>"; 
        allTime=0;stime=new Date;count=0; 
        dataTest(); 
       } 
      }; 

      request.onerror = function(e) { 
      console.log("Error Adding: ", e); 
      }; 
     }; 

     html5rocks.indexedDB.addData = function(d) { 
      var db = html5rocks.indexedDB.db; 
      var trans = db.transaction(["todo"], IDBTransaction.READ_WRITE); 
      var store = trans.objectStore("todo"); 
      var data={ 
       "text":d, 
       "number":1 
      }; 
      var request = store.put(data); 

      request.onsuccess = function(e) { 
       etime=new Date; 
       var t=document.getElementById('result').innerHTML; 
       document.getElementById('result').innerHTML=t+((etime.valueOf()-stime.valueOf()))+"<br/>"; 
      }; 

      request.onerror = function(e) { 
      console.log("Error Adding: ", e); 
      }; 
     }; 



     function addTest() { 
      for(i=1;i<=times*MAX;i++) 
       html5rocks.indexedDB.addTodo('   ',i); 
     } 
     function getTest() { 
      for(i=1;i<=times*MAX;i++) 
       html5rocks.indexedDB.getTodo(Math.round(Math.random()*(MAX*times-1)+1)); 
     } 
     function delTest() { 
      for(i=1;i<=times*MAX;i++) 
       html5rocks.indexedDB.deleteTodo(i); 
     } 
     function dataTest() { 
      data=' '; 
      for(i=1;i<=21;i++) 
       data=data+data; 
      stime=new Date 
      html5rocks.indexedDB.addData(data); 
     } 
     function init() { 
      stime=new Date; 
      allTime=0; 
      html5rocks.indexedDB.open(); 

     } 

cevap

3

Spesifikasyon sonlandırılmamış. Bu, standart son haline gelene kadar şu anda Chrome'da Gecko ve webkitIndexedDB numaralı mülkte mozIndexedDB mülkü olarak gönderilmektedir. Öyleyse moz için de yazmalısın. Şimdi bu kod sadece webkit içindir.

https://developer.mozilla.org/en/IndexedDB

+0

Teşekkürler. Ve bu "onupgradeneeded" etkinliği krom destekliyor mu? Başka bir deyişle krom için "setVersion" kullanmaya devam etmeli miyim? – user840866

+0

17+ kromun üzerinde onu uygulamak için plan var ama henüz onaylanmadı. Şimdi ve krom için setVersion kullanmakta faydası, "onupgradeneeded" uygulasa bile birkaç yayın daha destekleyecektir. –

1

setVersion() is Deprecated

yeni bir yol, yeni özellikleri ile sürüm 10.0 uygular açık() gelen

ateş IDBDatabase.open() yöntemde versiyonu tanımlamak için olan bir IndexedDB içinde veritabanı IDBDatabase sürümü, open() yönteminin

yönteminin ikinci parametresi olarak ayarlandı

örnek

var v = "1.20"; 
var request = indexedDB.open("todos", v); 

0

Buradaki sorun doğru yanıt seçildi biri değil.

Sorun, HTML5Rocks'taki IndexedDB örneklerinin Ocak ayı öncesi IndexeDB özelliklerine yazılmasıdır. Çalışma grubu o zamandan beri setVersion API'sinden yeni onupgradedneeded stiline geçişte bir değişiklik yaptı.

Burada Firefox, teknik olarak başarısız olmakta doğrudur. Chrome'un aynısını görmek için Star this issue.