2014-03-28 24 views
2

我想用JSON數組填充phonegap sqlite數據庫,獲取JSON的Web服務正在工作並且數據加載得很好,但是當我嘗試將其插入到表中時它不斷給我一個undefined SQL錯誤。用JSON數組填充phonegap sqllite數據庫

這裏是我的代碼:

function populateDB(tx) { 
    //Setup database table 
    tx.executeSql('DROP TABLE IF EXISTS Profiles'); 
    tx.executeSql('CREATE TABLE IF NOT EXISTS Profiles (id unique, name, email, phone)'); 
    //Get data 
    var values; 
    var base_url = "https://www.hoomz.nl/staging/index.php/api/"; 
    $.getJSON(base_url + 'profiles', function(result) { 
     $.each(result, function(i, item) { 
      console.log(item.name); 
      console.log('(' + item.id + ', "' + item.id + '", "' + item.id + '", "' + item.id + '"),'); 
      values = values + '(' + item.id + ', "' + item.id + '", "' + item.id + '", "' + item.id + '"),'; 
     }); 
     console.log(values); 
     tx.executeSql('INSERT INTO Profiles (id, name, email, phone) VALUES' + values + ';'); 
    }); 
    console.log(values); 
    tx.executeSql('INSERT INTO Profiles (id, name, email, phone) VALUES' + values + ';'); 
} 

也給這個錯誤: Uncaught InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable

+0

爲什麼你有最後一個executeSql?看起來像一個錯誤(但可能不是錯誤)。 –

回答

5

在這種情況下引發的錯誤是,當SQL引擎試圖插入值時,對象不再存在。您應該將JSON結果存儲在全局變量中,然後執行SQL操作。嘗試執行代碼下面看看結果。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
<script type="text/javascript" charset="utf-8" src="cordova.js"></script> 
<script type="text/javascript" charset="utf-8"> 
    var db = null; 
    var resultJSON; 
    function insertIntoDB() { 
     db.transaction(function (tx){ 
     tx.executeSql('DROP TABLE IF EXISTS Profiles'); 
     tx.executeSql('CREATE TABLE IF NOT EXISTS Profiles (id , name, email, phone)'); 
     var recursiveFunction = function(index) { 
     if (index < resultJSON.length) { 
      tx.executeSql('INSERT INTO Profiles (id, name, email, phone) VALUES (?, ?, ?, ?)', 
       [resultJSON[index].id,resultJSON[index].name,resultJSON[index].email,resultJSON[index].phone], function(){index++; recursiveFunction(index)}, errorCB); 
     } 
     } 
     recursiveFunction(0); 
    }); 
    } 

    function errorCB(err) { 
    console.log("Error processing SQL: "+err.code+":"+err.message); 
    } 

    function onDeviceReady() { 
    db = window.openDatabase("test", "1.0", "Test DB", 1000000); 
    var base_url = "https://www.hoomz.nl/staging/index.php/api/"; 
    $.getJSON(base_url + 'profiles', function(result) { 
     resultJSON = result;   
     insertIntoDB(); 
    }); 
    } 
    document.addEventListener("deviceready", onDeviceReady, false); 
    </script> 
+0

這解決了我的問題,非常感謝! –

+0

@DennisvanMeel u r wc –

+0

我們應該在onDeviceReady函數中放入create db語句db = window.openDatabase()嗎?我可以把它放在其他地方嗎?因爲我使用cli創建了cordova項目,因此在其他js文件中的onDeviceReady()函數中。 –

0

我想我看到你的問題。您正在循環每個結果並追加值。在循環之後,你可以插入。但是,如果你有2個或多個結果,那麼數值變量會像

(stuff here)(stuff here)(stuff here) 

你可能想每個內部的插入。

0

你做的有點不對。您正在爲「每個循環」進行迭代,並且在每次迭代中將值插入到字符串變量「Value」中,因爲插入包含4列,但「Value」包含值的第n個值,請嘗試下面的代碼:

function populateDB(tx) { 
    //Setup database table 
    tx.executeSql('DROP TABLE IF EXISTS Profiles'); 
    tx.executeSql('CREATE TABLE IF NOT EXISTS Profiles (id unique, name, email, phone)'); 

    //Get data 
    var values; 
    var base_url = "https://www.hoomz.nl/staging/index.php/api/"; 
    $.getJSON(base_url + 'profiles', function (result) { 
     $.each(result, function (i, item) { 
      console.log(item.name); 
      console.log('(' + item.id + ', "' + item.id + '", "' + item.id + '", "' + item.id + '"),'); 
      tx.executeSql('INSERT INTO Profiles (id, name, email, phone) VALUES(' + item.id + ', "' + item.id + '", "' + item.id + '", "' + item.id + '")'); 
     }); 
    }); 
}