SQLError 19 UNIQUE约束失败

时间:2015-07-09 21:10:40

标签: javascript sql angularjs cordova network-programming

我在设置应用时,创建本地数据库并只是插入第一个用户(已在本地登录)时收到此错误。请在代码中查看我收到错误消息的注释。

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。

2 个答案:

答案 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来读/写数据库版本,因此知道您必须创建表/插入值或者数据库是否已准备就绪。

相关问题