IBM Worklight API Cordova 存储 - Sql 错误:由于 containt 故障(19 约束失败



我对SQLite中的insert语句有问题。我有一个应用程序,它使用 sql 适配器从远程数据库(本地主机)获取数据并将其存储到设备中。我已经在设备中创建了一个数据库,其模式与"远程"数据库相同。我想将所有记录从远程数据库复制到设备 db,但是当我使用 api cordova storare 运行 insert 语句时,由于 containt 失败(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捕获了错误,但插入显然有效,因为当我在浏览器上看到Web存储时,其中有19条记录。

如果记录表中,则UNIQUE约束会阻止您插入重复项。

若要防止出现重复项的错误,请将"插入"替换为"插入"或"忽略"。

只需删除您的表并重新创建它,或者为了更安全,请检查您尝试插入的所有行是否存在。

以前遇到过类似的情况,我所做的只是删除表格并再次创建它。 我意识到的是,我试图插入到一个确实存在或在更新表格行时已更改的表格列中。

最新更新