2012-07-05 1 views
0

webgate에서 phonegap으로 일부 데이터를 초기화하고 싶습니다.Websql 테이블 초기화 오류

다음은 내 코드의 일부입니다. init 테이블은 항상 오류 콜백으로 이동합니다. 이유를 찾지 못했습니다.

브라우저에서 직접 테스트 할 수 있습니다. 내가 크롬 테스트 사용

[ 
    { 
     "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": "" 
    } 
] 

처럼

<!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 파일입니다. 경고 "SQL 처리 중 오류 : 정의되지 않음". Pls는 어디서 잘못되었는지 찾아내는 데 도움을줍니다.

+0

어떤 브라우저? 정확한 오류 메시지 란 무엇입니까? 콘솔에 오류가 있습니까? – Neal

+0

나는 크롬 테스트를 거쳤습니다. 경고 "SQL 처리 중 오류 : 정의되지 않음". – yuyue007

답변

1

코드가 약간 변경되었으며 지금은 제대로 작동합니다. 나는 크롬에서뿐만 아니라 안드로이드 2.2에서 테스트했으며 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

+0

그것은 작동합니다! 나는 그것을 알아 채지 못했다. Web sql로 코딩 할 때 나에게 다른 조언이 있습니까? – yuyue007

+0

고마워요! 나는 JS에 새로 왔고 여전히 이곳 저곳에 걸려 넘어졌습니다. 이것은 꽤 통찰력이있었습니다. –