Ошибка инициализации таблицы Websql

Я хочу инициализировать некоторые данные в веб-sql с помощью phonegap.

Ниже приведена часть моего кода, когда таблица инициализации всегда вызывает обратный вызов ошибки. Я не нашел причину.

Вы можете напрямую протестировать его в браузере.

<!DOCTYPE HTML>
<html>
<head>
<title>Cordova</title>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

    <script type="text/javascript" charset="utf-8">
    var db = null;
    //document.addEventListener("deviceready", onDeviceReady, false);
    $(document).ready(function(){
        onDeviceReady();
    });


    function errorCB(tx, err) {
        alert("Error processing SQL: "+err);
    }

    function successCB() {
        console.log("success!");
    }

    function onDeviceReady() {
        var dBVersion = localStorage.getItem("db_version");
        if(dBVersion == null){
            db = initDB();
            //init table, set db_version to local storage
            db.transaction(initTable, errorCB, function(){localStorage.setItem("db_version","1.0");});
        }else{
            db = openDatabase('beauty', dBVersion, 'test offline database', 200000);
        }
    }

    function initDB(){
        var myDB = null;
        try { 
            if (!window.openDatabase) { 
              alert('db init failed'); 
            } else {
                var shortName = 'beauty'; 
                var version = '1.0'; 
                var displayName = 'test offline database'; 
                var maxSize = 200000; 
                myDB = openDatabase(shortName, version, displayName, maxSize);
          }
      } catch(e) { 
          console.log(e);
          if (e.name == "INVALID_STATE_ERR") { 
              console.log("Invalid database version.");
          } else { 
              alert("Unknown error "+e+"."); 
          } 
      } 
      return myDB; 
    }

    function initTable(tx){
        $.getJSON("data.json",function(data){
            tx.executeSql('CREATE TABLE IF NOT EXISTS images (id INTEGER PRIMARY KEY, url TEXT, tag TEXT, type TEXT,status TEXT, unlocktime INTEGER, favorite INTEGER, phase INTEGER,other TEXT)');
            for(var i=0; i<data.length; i++){
                tx.executeSql('insert into images values ('+ data[i].id +',"' + data[i].url +'","' + data[i].tag +'","'+ data[i].type +'","' + data[i].status + '",' +data[i].unlocktime+','+data[i].favorite+','+data[i].phase+',"'+ data[i].other +'");');
            }
            console.log("init ok!");
        });
    }



    </script>
</head>
<body>
    <input type="button" value="Get Image" onclick="test()" /> <br/>

</body>
</html>

Файл json похож на

[
    {
        "id": 101001,
        "url": "img/1.jpg",
        "tag": "other",
        "type": "local",
        "status": "normal",
        "unlocktime": 0,
        "favorite": 0,
        "phase": 1,
        "other": ""
    },
    {
        "id": 101002,
        "url": "img/2.jpg",
        "tag": "other",
        "type": "local",
        "status": "normal",
        "unlocktime": 0,
        "favorite": 0,
        "phase": 1,
        "other": ""
    }
]

Я использую проверенный Chrome. Это предупреждение «Ошибка обработки SQL: не определено». Пожалуйста, помогите выяснить, где не так.


person yuyue007    schedule 05.07.2012    source источник
comment
Какой браузер? Каково точное сообщение об ошибке? Какая-то ошибка в консоли?   -  person Naftali aka Neal    schedule 05.07.2012
comment
Я использую проверенный Chrome. Он предупреждает об ошибке обработки SQL: undefined.   -  person yuyue007    schedule 05.07.2012


Ответы (1)


Я немного изменил ваш код, и теперь он работает. Я тестировал в Android 2.2, а также в Chrome, и он сохраняет данные в таблице, как определено в файле json.

В качестве изменения я сделал вызов транзакции базы данных из initTable() вместо вызова initTable() в качестве обратного вызова, поскольку объект транзакции недоступен после завершения вызова метода, и вы создаете таблицу и вставляете данные в обратный вызов.

    function onDeviceReady() {
        var dBVersion = localStorage.getItem("db_version");
        if(dBVersion == null){
            window.db = initDB();
            //init table, set db_version to local storage
            initTable();
        }else{
            window.db = openDatabase('beauty', dBVersion, 'test offline database', 200000);
        }
    }

    function initTable(){
            $.getJSON("data.json",function(data){
                db.transaction(function(tx){
                    tx.executeSql('CREATE TABLE IF NOT EXISTS images (id INTEGER PRIMARY KEY, url TEXT, tag TEXT, type TEXT,status TEXT, unlocktime INTEGER, favorite INTEGER, phase INTEGER,other TEXT)');
                    for(var i=0; i<data.length; i++){
                        tx.executeSql('insert into images values ('+ data[i].id +',"' + data[i].url +'","' + data[i].tag +'","'+ data[i].type +'","' + data[i].status + '",' +data[i].unlocktime+','+data[i].favorite+','+data[i].phase+',"'+ data[i].other +'");');
                    }
                    console.log("init ok!");                
                }, errorCB, function(){localStorage.setItem("db_version","1.0");});
            });
        }

Полный исходный код — https://gist.github.com/3055095.

person dhaval    schedule 05.07.2012
comment
Оно работает! Я этого не заметил. Есть ли у вас какие-либо другие советы для меня при кодировании с помощью веб-sql? - person yuyue007; 06.07.2012
comment
Спасибо ! Я новичок в JS и все еще спотыкаюсь. Это было довольно познавательно. - person Vipassana Vijayarangan; 09.10.2013