2012-03-01 11 views
5

次のコードを使用してIndexedDBのパフォーマンスをテストしようとしました。 コードはhttp://www.html5rocks.com/en/tutorials/indexeddb/todo/, から修正されていますが、Chromeでうまく動作しますが、Firefox 10では「db.setVersionは関数ではありません。 Firefoxを動作させるためにコードを変更するにはどうすればいいですか?indexedDBを使用しているときに "setVersion"が関数エラーではない

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

     } 

答えて

3

仕様が確定していません。現在、GeckoではmozIndexedDB、標準化が完了するまではwebkitIndexedDBというプロパティで出荷されています。だから、あなたもmozのために書く必要があります。今、このコードはWebkitのためのものです。

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

+0

ありがとうございました。そして、クロムはこの "onregradeneeded"イベントをサポートしていますか?言い換えれば、クロムの「setVersion」を使用する必要がありますか? – user840866

+0

17+クロムについては、それを実装する計画がありますが、まだ確認されていません。 setVersion for nowとchromeを使うのは、 "onupgradeneeded"を実装していても、それ以上のリリースではサポートされます。 –

1

setVersion() is Deprecated

新しい方法IDBDatabase.open()方法バージョンから

のFirefox 10.0実装するオープン()内のIndexedDB新しい仕様でバージョンを定義することですデータベースIDBDatabaseのバージョンがopen()メソッドの第2パラメータとして設定されます

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

0

ここでの問題は、正解として選ばれたものではありません。

問題は、HTML5RockのIndexedDBの例が1月前のIndexeDB仕様に書き込まれていることです。ワーキンググループは以来、setVersion APIから新しいonupgradedneededスタイルへと移行しています。

ここで、Firefoxは技術的には失敗します。 Star this issue Chromeで同じことを確認したい場合は

関連する問題