IBM工作灯API科尔多瓦存储 - SQL错误:不能因constaint失败执行语句(19约束失败

2019-10-18 18:29发布

我与一个问题insert在sqlite的声明。 我有一个应用程序从远程数据库(本地主机)与SQL适配器获得数据并将它们存储到一个设备。 我已经创建了一个分贝到装置,其中“远程” DB的相同的模式。 我想从远程数据库中的所有记录复制到设备数据库,但是当我运行insert与API科尔多瓦storare声明我得到的错误不能执行语句由于constaint失败(19约束失败)。 它很奇怪。

在这里它创建功能分贝装置

function createLocalDb(size){

    function createDB(tx) {
         tx.executeSql("CREATE TABLE IF NOT EXISTS canti (" +
                       "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                       "titolo VARCHAR(50) NOT NULL, " +
                       "autore VARCHAR(50) NOT NULL, " +
                       "id_categoria VARCHAR(50), " +
                       "testo TEXT," +
                       "UNIQUE(titolo,autore))");
         tx.executeSql("CREATE TABLE IF NOT EXISTS categorie (" +
                       "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                       "titolo VARCHAR(50) NOT NULL UNIQUE, " +
                       "attiva INTEGER(1) DEFAULT '0')");

    }

    function errorCB(err) {
        WL.Logger.debug("Error processing SQL on createLocalDb: " + err.message);
    }

    function successCB() {
        WL.Logger.debug("Database created correctly");

        WL.Client.invokeProcedure({
            adapter : 'DbConnect',
            procedure : 'getCanti',
            parameters: []
        }, {
            onSuccess : success,
            onFailure : failure
        });

        function success(result){
            WL.Logger.debug("Success on invoking getCanti procedure");
            populateCanti(result);
        }
        function failure(result){
            WL.Logger.debug("Failure on invoking getCanti procedure");
        }

        WL.Client.invokeProcedure({
            adapter : 'DbConnect',
            procedure : 'getCategorie',
            parameters: []
        }, {
            onSuccess : success2,
            onFailure : failure2
        });

        function success2(result){
            WL.Logger.debug("Success on invoking getCategorie procedure");
            populateCategorie(result);
        }
        function failure2(result){
            WL.Logger.debug("Failure on invoking getCategorie procedure");
        }

    }   

    if(size>0){
        var db = window.openDatabase("db_canti", "1.0", "db_canti", size);
        db.transaction(createDB, errorCB, successCB);
    }
    else{
        WL.Logger.debug("Cannot create database with size 0");
    }
}

这里的两个函数来填充表:

function populateCanti(item){

    var db = window.openDatabase("db_canti", "1.0", "db_canti", size);
    db.transaction(populateDB, errorCB, successCB);

    function populateDB(tx){
        for(var i=0;i<item.invocationResult.resultSet.length;i++){
            WL.Logger.debug(i+")Sto inserendo " + item.invocationResult.resultSet[i].titolo + "," + item.invocationResult.resultSet[i].autore + "," + item.invocationResult.resultSet[i].id_categoria);
            tx.executeSql("INSERT INTO canti(titolo,autore,id_categoria,testo) " +
                    "VALUES('"+item.invocationResult.resultSet[i].titolo+"','" +
                            +item.invocationResult.resultSet[i].autore+"','" +
                            +item.invocationResult.resultSet[i].id_categoria+"','" +
                            +item.invocationResult.resultSet[i].testo+"')");
        }
    }

    function successCB(err) {
        WL.Logger.debug("Table 'canti' OK");
        checkLocalDb();
    }

    function errorCB(err) {
        WL.Logger.debug("Error processing SQL on populateCanti: " + err.message);
    }

}

function populateCategorie(item){

    var db = window.openDatabase("db_canti", "1.0", "db_canti", size);
    db.transaction(populateDB, errorCB, successCB);

    function populateDB(tx){
        for(var i=0;i<item.invocationResult.resultSet.length;i++){
            tx.executeSql("INSERT INTO categorie(titolo,attiva) " +
                    "VALUES('"+item.invocationResult.resultSet[i].titolo+"','" +
                            +item.invocationResult.resultSet[i].attiva+"')");
        }
    }

    function successCB(err) {
        WL.Logger.debug("Table 'categorie' OK");
    }

    function errorCB(err) {
        WL.Logger.debug("Error processing SQL on populateCategorie: " + err.message);
    }

}

此外,该表categorie抓住了错误,但插入的作品显然,因为当我看到浏览器的网络存储,有19条记录它。

Answer 1:

如果这些记录在表中,那么UNIQUE约束阻止你插入重复。

为了避免得到错误的重复,以取代INSERT INSERT或忽略 。



Answer 2:

刚放下你的表并重新创建它,或者如果所有的行您要插入存在或不存在安全方面检查..

我以前有过类似的情况,我所做的就是删除表,并重新创建它。 我知道那是什么我试图插入表列中确实存在或当我更新表行发生了变化。



文章来源: IBM Worklight API Cordova storage - Sql error: could not execute statement due to a constaint failure (19 constraint failed)