5

javascriptでsqliteを使用してキャッシュを実装しようとしています。文字列にキャストしてデータベースに入力しようとしているjsonオブジェクトがありますが、構文エラーが発生し続けます。

テーブルは、md5文字列とjson文字列の2つのフィールドで構成されています。ここでは、dbとテーブルを定義する方法を説明します。

   db = window.openDatabase("Database", "1.0", "Cordova Demo",10485760);

    db.transaction(function(tx){
         tx.executeSql('DROP TABLE IF EXISTS CACHE_DATA');
         tx.executeSql('CREATE TABLE IF NOT EXISTS CACHE_DATA (md5 TEXT UNIQUE, data TEXT)');
    },function(tx,error){
        console.log('tx error: ' + error);
    },function(){
        console.log('tx success');
    });

これは、変数d.dataがjsonオブジェクトであるデータを入力しようとしている方法です。

   var jsonString = JSON.stringify(d.data, null, '');

            db.transaction(function(tx){
                tx.executeSql('INSERT OR REPLACE INTO CACHE_DATA (md5, data) VALUES ("'+hash+'", "'+jsonString+'")');
            },function(tx,error){
                console.log(JSON.stringify(tx.message));
                console.log(JSON.stringify(error));
            },function(){
                console.log('tx success');
            });

             console.log(jsonString);

どちらがスローされ、エラーが発生します

08-27 23:19:55.702: E/SQLiteLog(29831): (1) near "networks": syntax error

入力しようとしている実際の文字列は次のようになります

08-27 23:19:55.652: D/CordovaLog(29831): {"networks":[{"id":"66","name":"Test"}],"expires":1346138396}

json文字列の引用符と関係があると思っていましたが、フィールドタイプは単なるテキストであるため、構文エラーが何であるかはわかりません。

何か案は?

4

4 に答える 4

7

JSON文字列が文字列に変換された後、エスケープする必要があることがわかりました

            var jsonString = escape(JSON.stringify(d.data));

            db.transaction(function(tx){
                tx.executeSql('INSERT OR REPLACE INTO CACHE_DATA (md5, json, expires) VALUES ("'+hash+'", "'+jsonString+'","'+expireStamp+'")');
            },function(tx,error){
                console.log(JSON.stringify(tx.message));
                console.log(JSON.stringify(error));
            },function(){

                });
于 2012-08-28T11:13:43.063 に答える
3

それらを配列として渡そうとしましたか:

var valuesInArray = [hash, JSON.stringify(d.data, null, "");

tx.executeSql("INSERT OR REPLACE INTO CACHE_DATA (md5, data) VALUES (?, ?)", valuesInArray, function(tx, result)  {
  // Success Callback
});
于 2012-08-28T07:55:44.203 に答える
1

encodeURI()とを試すこともできdecodeURI()ます。簡単な例を次に示します。

var jsonString = encodeURI(JSON.stringify(d.data, null, ''));

        db.transaction(function(tx){
            tx.executeSql('INSERT OR REPLACE INTO CACHE_DATA (md5, data) VALUES ("'+hash+'", "'+jsonString+'")');
        },function(tx,error){
            console.log(JSON.stringify(tx.message));
            console.log(JSON.stringify(error));
        },function(){
            console.log('tx success');
        });

そしてデコード用

var data = JSON.parse(decodeURI(sqlData.data));

注: escape()unescape()が機能する場合があります。しかし、escape()関数は JavaScript バージョン 1.5 で廃止されました。

于 2018-02-06T10:05:14.030 に答える