我在设置应用时,创建本地数据库并只是插入第一个和仅用户(已在本地登录)时收到此错误。请在代码中查看我收到错误消息的注释。
angular.module("greenApp")
.service("dbService",['$q', function($q){
var db;
var promise = function(){
var deferred = $q.defer();
db = window.openDatabase('greenDB', '1.0', 'Green Database', 2*1024*1024);
db.transaction(function(tx){
tx.executeSql("CREATE TABLE IF NOT EXISTS user (user TEXT PRIMARY KEY) ")
}, function(err){
alert('Something went wrong... Error: DATABASE INIT ' + err);
}, function(scc){
deferred.resolve();
})
return deferred.promise;
}
promise();
var query = function(sql, args) {
var deferred = $q.defer();
db.transaction(function(tx) {
tx.executeSql(sql, args, function(tx, results) {
deferred.resolve(results);
});
}, function(err) {
deferred.reject(err);
});
return deferred.promise;
};
var insert_into = function(args) {
var queryPromise = query("INSERT INTO user (user) VALUES (?)", args);
console.log("in insert_into", queryPromise) // Error message comes here
return queryPromise;
};
return {
promise: promise,
insert_into: insert_into,
};
}]);
args
只是["user-name-string"]
,我收到一条错误消息:
“由于constaint失败而无法执行语句(19 UNIQUE 约束失败:user.user)
任何想法可能发生了什么?完全相同的代码正在运行并在最近的纯Cordova项目中工作,我刚刚移植到Ionic。
答案 0 :(得分:2)
看起来你在代码中插入两次......这里
var insert_into = function(args) {
var queryPromise = query("INSERT INTO user (user) VALUES (?)", args);
console.log("in insert_into", queryPromise) // Error message comes here
return query("INSERT INTO user (user) VALUES (?)", args); <-- you did a query above, now you do it again?!?
};
答案 1 :(得分:0)
当您退出应用程序时,sqlite数据库仍然存在,因此每次启动应用程序时,它都会尝试执行插入操作。 (我认为它在第一次启动时起作用,你第二次得到了错误。)
当您使用CREATE TABLE IF NOT EXISTS
时,应用程序不会在创建表时失败,而是在第一次插入时失败。
您可以使用pragma user_version来读/写数据库版本,因此知道您必须创建表/插入值或者数据库是否已准备就绪。