Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.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
当应用程序转到后台时,iOS Phonegap sqlite数据库被锁定_Ios_Html_Sqlite_Cordova - Fatal编程技术网

当应用程序转到后台时,iOS Phonegap sqlite数据库被锁定

当应用程序转到后台时,iOS Phonegap sqlite数据库被锁定,ios,html,sqlite,cordova,Ios,Html,Sqlite,Cordova,现在我正在开发phonegap应用程序: 在iOS中,当应用程序转到后台时,sqlite db中的插入操作被锁定(在android中也是如此)。当应用程序运行时,数据库操作将顺利进行 为什么会发生这种情况,我该如何处理 我认为您已经使用了for循环进行插入,本质上是异步的Javascript 您需要以以下样式执行批处理sql查询,而不是使用for循环 db=window.openDatabase(“Demo”、“1.0”、“BusinessApp”,200000) insertIndex=0;

现在我正在开发phonegap应用程序:

在iOS中,当应用程序转到后台时,sqlite db中的插入操作被锁定(在android中也是如此)。当应用程序运行时,数据库操作将顺利进行


为什么会发生这种情况,我该如何处理

我认为您已经使用了for循环进行插入,本质上是异步的Javascript

您需要以以下样式执行批处理sql查询,而不是使用for循环

db=window.openDatabase(“Demo”、“1.0”、“BusinessApp”,200000)

insertIndex=0;
var insertCounter=0;
insertBatch=函数(数组、数组长度、表名、字段问题、cb){
日志(“插入记录:+insertCounter”);
if(插入索引<阵列长度){
数据库事务(功能(tx){
var sql='插入或忽略到'+tableName+'值'+fieldQuestions;
log(“sql:+sql”);
log(“sql:----------------”;
log(数组[insertIndex]);
tx.executeSql(sql,数组[insertIndex],
功能(发送、恢复){
insertIndex++;
控制台日志(“插入成功”);
insertBatch(数组、数组长度、表名、字段问题、cb);
},函数(){
控制台日志(“插入失败”);
});
});
}否则{
插入索引=0;
cb();
}
}
db.事务(填充B、错误CB、成功CB);
函数填充B(tx){
tx.executeSql('DROP TABLE IF EXISTS?',[“news”],function()){
console.log(“成功删除”)
},函数(){
console.log(“故障下降”)
});
tx.executeSql('CREATE TABLE IF NOT EXISTS news(新闻id整数、新闻标题文本、新闻内容文本));
}
函数errorCB(){
警报(“错误:Init.js ErrorCB”);
}
函数successCB(){
//警惕();
log('DB Created Success');
var dataArray=[]
推送([1,“一”,“第一条新闻内容”])
推送([2,“2”,“2新闻内容])
推送([3,“三”,“2新闻内容])
推送([4,“4”,“4新闻内容])
insertBatch(dataArray,dataArray.length,“新闻”,“(?,?,?)”,成功)
函数成功(){
console.log(“所有成功”)
}
}

因此,每个executeSQL函数都需要先前的executeSQL成功回调

可能是因为iOS不支持多任务处理。当应用程序进入后台时,会暂停;不是在后台运行。而在安卓系统中,则有真正的多任务处理。我的应用程序在后台运行,并成功地收集了位置数据。但是后台的sqlite操作只会失败。
insertIndex = 0;
var insertCounter = 0;
insertBatch = function(array, arrayLength, tableName, fieldQuestions, cb) {
    console.log("Inserting Record :" + insertCounter);
    if (insertIndex < arrayLength) {
        db.transaction(function(tx) {
            var sql = 'INSERT OR IGNORE INTO ' + tableName + ' VALUES ' + fieldQuestions;
            console.log("sql: " + sql);
            console.log("sql:------------- ");
            console.log(array[insertIndex]);

            tx.executeSql(sql, array[insertIndex],
                function(tx, res) {
                    insertIndex++;
                    console.log("Insert success");
                    insertBatch(array, arrayLength, tableName, fieldQuestions, cb);
                }, function() {
                    console.log("Insert failure");
                });
        });

    } else {
        insertIndex = 0;
        cb();
    }
}

db.transaction(populateDB, errorCB, successCB);


function populateDB(tx) {

    tx.executeSql('DROP TABLE IF EXISTS ?', ["news"], function() {
        console.log("success drop")
    }, function() {
        console.log("failure drop")
    });
    tx.executeSql('CREATE TABLE IF NOT EXISTS news (news_id INTEGER,news_header TEXT,news_content TEXT)');

}

function errorCB() {
    alert("Error: Init.js ErrorCB");
}

function successCB() {
    //alert();
    console.log('DB Created Success');
    var dataArray = []
    dataArray.push([1, "ONE", "First News Content"])
    dataArray.push([2, "TWO", "2 News Content"])
    dataArray.push([3, "THREE", "2 News Content"])
    dataArray.push([4, "FOUR", "4 News Content"])

    insertBatch(dataArray, dataArray.length, "news", "(?,?,?)", success)

    function success() {

        console.log("all success")
    }

}