Cordova SQLite UTF8在插入时抛出错误

时间:2015-02-14 04:39:55

标签: android sqlite cordova utf-8

我有一个用ionic和cordova编写的应用程序,可以在数据库中插入名称。数据库连接打开如下:

var db = window.openDatabase('zpassplus', '1.0', 'ZPass+', 1000000);

然后通过http从服务器获取数据,然后将其插入表中,如下所示:

         $http({
                    url: settings().api_host + 'contact?token=' + $rootScope.authToken,
                    method: "GET",
                    data: {'token': $rootScope.authToken},
                    headers: {
                                'Content-Type':'application/x-www-form-urlencoded; charset=utf-8'
                    }
                })
        .success(function(data, status) {
            if(data.success === true) {
                db.transaction(function(tx) {

                    for(var i in data.data.contact.contactRiders)
                    {
                        var sqlString, active, rider = data.data.contact.contactRiders[i];

                        if(rider.active) {
                            active = 1;
                        } else {
                            active = 0;
                        }

                        sqlString = "INSERT OR IGNORE INTO riders (fname,lname,imagedata,active,riderId) VALUES('" + rider.firstName + "','" + rider.lastName + "','" + $rootScope.defaultPortrait +"'," + active + "," + rider.riderId + ")";

                        console.log("insert into riders: " + sqlString);
                        tx.executeSql(sqlString);
                    }

                }, function(err) {
                    //error callback
                    console.log("Error processing SQL: "+err.message);
                }, function(){
                    // this should be the last thing
                    console.log("rider insert success");
                    $location.path('/activity');
                    $rootScope.$apply();
                });
            }
        })
        .error(function(err) {
            // ummm ....
        });

问题是这样,当一个utf8字符串作为rider属性之一传递时,SQL语句失败。因为我在执行之前有那个console.log,所以我有违规的SQL语句,它是:

INSERT OR IGNORE INTO riders (fname,lname,imagedata,active,riderId) VALUES('Nñicole','Rock','<base64 endcode image here>',1,8824)

它抛出的错误是:

Error processing SQL: near "t": syntax error

我使用空字符串为base64编码的图像字符串运行此相同的例程,并得到相同的错误并再次使用空字符串运行第一个名称,并且它成功了。所以我很确定它是导致问题的原因。但我无法在命令行或其他任何地方复制它。此外,似乎SQLite应该完全适应UTF8。我错过了什么?

1 个答案:

答案 0 :(得分:1)

经过漫长的疯狂之后,我终于解决了这个问题。对于遇到此laster的任何人来说,问题是逃避单引号。以上几行:

sqlString = "INSERT OR IGNORE INTO riders (fname,lname,imagedata,active,riderId) VALUES('" + rider.firstName + "','" + rider.lastName + "','" + $rootScope.defaultPortrait +"'," + active + "," + rider.riderId + ")";

console.log("insert into riders: " + sqlString);
tx.executeSql(sqlString);

已更改为:

var params;
var sqlString = "INSERT OR IGNORE INTO riders (fname,lname,imagedata,active,riderId) VALUES(?,?,?,?,?)";

if(rider.portraitIncluded === true) {
    params = [rider.firstName, rider.lastName, rider.portrait, active, rider.riderId];
} else {
    params = [rider.firstName, rider.lastName, $rootScope.defaultPortrait, active, rider.riderId];
}

console.log("insert into riders: " + sqlString);
tx.executeSql(sqlString, params);

我的调试取代了first_name的所有实例,所以我错过了另一名名叫奥布莱恩的学生。

提示:

1)始终使用准备好的陈述 2)不要像同步程序一样进行调试,在执行错误的SQL之后但在抛出错误之前发生了最后console.log次写入。 3)UTF8在cordova / javascript / http中运行得很好,如果你认为这是你的问题,你可能错了。