使用indexedDB时,获取“setVersion”不是函数错误

时间:2012-03-01 18:20:00

标签: javascript html5 indexeddb

我尝试使用以下代码来测试IndexedDB的性能。 代码是从http://www.html5rocks.com/en/tutorials/indexeddb/todo/修改的, 它在chrome中运行良好,但在Firefox 10中失败,说“db.setVersion不是函数”。 我想知道如何修改代码以使其在firefox中运行?

        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 个答案:

答案 0 :(得分:3)

规范尚未最终确定。目前,这是Gecko中的 mozIndexedDB 属性和Chrome中的 webkitIndexedDB ,直到标准最终确定。所以你必须为moz写作。现在这段代码仅适用于webkit。

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

答案 1 :(得分:1)

setVersion() is Deprecated

  

新方法是在IDBDatabase.open()方法

中定义版本

10.0版的firefox使用新规范实现open(),其中indexeddb数据库IDBDatabase版本被设置为open()方法的第二个参数

示例

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

答案 2 :(得分:0)

这里的问题不是选择正确的答案。

问题是HTML5Rocks上的IndexedDB示例是写入1月之前的IndexeDB规范。此后,工作组发布了从setVersion API到新onupgradedneeded样式的重大变化。

在这里,Firefox在技术上是正确的失败。 Star this issue如果你想看到Chrome做同样的事情。