我有一个用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。我错过了什么?
答案 0 :(得分:1)
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中运行得很好,如果你认为这是你的问题,你可能错了。