【问题标题】:SQLError 19 UNIQUE constraint failedSQLError 19 UNIQUE 约束失败
【发布时间】:2015-07-09 21:10:40
【问题描述】:

我在设置我的应用程序、创建本地数据库并简单地插入 firstonly 用户(已在本地登录)时遇到此错误。请参阅代码中的注释以了解我收到错误消息的位置。

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"],我收到一条错误消息:

"由于约束失败,无法执行语句(19 UNIQUE 约束失败:user.user)

任何想法可能会发生什么?完全相同的代码在我刚刚移植到 Ionic 的最近的纯 cordova 项目中运行和工作。

【问题讨论】:

  • 你能不能显示你正在使用的 dbms 的表结构
  • 你想在表格中插入相同的文本吗?你能举个例子吗?
  • 我会直接在您的 insert_into 方法中抛出一个 console.log 语句并仔细检查以确保 args 是您所期望的,而不是例如 null。
  • 谢谢,但我已经做到了,args 符合预期,并且与问题中所述完全一致。
  • user 列名吗?

标签: javascript sql angularjs cordova network-programming


【解决方案1】:

看起来您在代码中插入了两次...这里

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?!?
};

【讨论】:

  • 是的,对不起,写得真的很糟糕。虽然错误出现在第二个查询之上..再次编辑问题仍然是同样的错误。
  • 如果您在将代码发布到此处之前重写代码,我们可能很难找到困扰您的问题。
  • 是的 - 但谁知道你还重写了什么?重写东西会引入新的错误来源。这就是我的观点。
【解决方案2】:

当您退出应用程序时,sqlite 数据库仍然存在,因此每次启动应用程序时它都会尝试执行插入操作。 (我猜它在第一次启动时有效,第二次出现错误)。

当您使用 CREATE TABLE IF NOT EXISTS 时,应用不会在创建表时失败,而是在第一次插入时失败。

您可以使用 pragma user_version 来读取/写入数据库的版本,因此知道在哪种情况下您必须创建表/插入值,或者数据库是否已经准备就绪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2021-12-09
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2020-04-24
    相关资源
    最近更新 更多