Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite IBM Worklight API Cordova存储-Sql错误:由于Constant失败(19约束失败),无法执行语句_Sqlite_Cordova_Ibm Mobilefirst - Fatal编程技术网

Sqlite IBM Worklight API Cordova存储-Sql错误:由于Constant失败(19约束失败),无法执行语句

Sqlite IBM Worklight API Cordova存储-Sql错误:由于Constant失败(19约束失败),无法执行语句,sqlite,cordova,ibm-mobilefirst,Sqlite,Cordova,Ibm Mobilefirst,我对sqlite中的insert语句有问题。我有一个应用程序,它使用sql适配器从远程数据库(localhost)获取数据,并将数据存储到设备中。我已经在设备中创建了一个db,它与“远程”db的模式相同。我想将所有记录从远程数据库复制到设备数据库,但当我使用api cordova storare运行insert语句时,由于Constant失败(19约束失败),我得到错误无法执行语句。真奇怪 这里是在设备上创建db的函数 function createLocalDb(size){ fun

我对sqlite中的
insert
语句有问题。我有一个应用程序,它使用sql适配器从远程数据库(localhost)获取数据,并将数据存储到设备中。我已经在设备中创建了一个db,它与“远程”db的模式相同。我想将所有记录从远程数据库复制到设备数据库,但当我使用api cordova storare运行
insert
语句时,由于Constant失败(19约束失败),我得到错误无法执行语句。真奇怪

这里是在设备上创建db的函数

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);
    }

}
函数populateCanti(项){
var db=window.openDatabase(“db_canti”,“1.0”,“db_canti”,size);
db.事务(填充B、错误CB、成功CB);
函数填充B(tx){
对于(var i=0;i如果记录在表中,则
UNIQUE
约束阻止您插入重复项


为防止重复数据出错,请将INSERT替换为。

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


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

更进一步,如果您打算替换数据库中存在的现有行,则应使用insert或RE奇怪的是,有一个重复的问题,我从另一个数据库获得的行。我注意到
UNIQUE(titolo,autore)上有一个问题
在表
canti
上。似乎这个约束不受尊重。有些记录的
titolo
相同,但
autore
不同,但当我运行sql insert时,它只放了一个。为什么?。请在SQLFIDLE上显示一个示例。@CL。如果我使用
insert或IGNORE
它会工作(没有错误消息)但它并没有添加我从localhost数据库获得的所有记录。