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 中工作得很好如果你认为那是你的问题,那你可能错了。
我有一个用 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 中工作得很好如果你认为那是你的问题,那你可能错了。