Cordova SQLite UTF8 在插入时抛出错误

Cordova SQLite UTF8 throws error on insert

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

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

然后通过 http 从服务器获取数据,然后像这样插入到 table 中:

         $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 完美兼容table。我错过了什么?

经过漫长的疯狂鹅机会,我终于解决了这个问题。对于任何 运行 进入这个 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 的所有实例,所以我错过了另一个名叫 O'Brian 之类的学生。

提示:

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