Windows 8应用程序Javascript和SQlite(数据库已锁定)

Windows 8 Application Javascript and SQlite (Database is locked)

本文关键字:数据库 锁定 SQlite 应用程序 Javascript Windows      更新时间:2023-12-12

我用javascript为windows 8 Metro UI编写了一些简单的应用程序。因为微软在Metro UI中使用Sqlite和Javascript的自然方法。我使用"doo"包装:dooWrapper SQLite(github)

我创建了一个方法:

function addSomething(name) {
    var dbPath = Windows.Storage.ApplicationData.current.localFolder.path + '''a_db.sqlite';
    SQLite3JS.openAsync(dbPath).then(function (db) {
        return db.runAsync("INSERT INTO STH (nazwa) VALUES (:name)", { name: name }).
        done(function () {
            console.log('Add sth : ' + name);
            db.close();
        }, function (error) {
            if (db) {
                db.close();
            }
            console.log('ERROR Adding sth' + error.message);
        })
    });
}

我收到错误"数据库被锁定"我在文档中读到了这个错误。但我有一个问题,在不创建带有集合参数的"insert"函数的情况下添加更多行的另一种解决方案是:insert(数组)?我只想在没有这个错误的情况下使用这个函数n次。有可能吗?

是的,有可能。。。我以前也犯过这个错误。。。。为此,您只需要建立一次数据库连接。。。我已经在我的应用程序中使用了这个,它运行良好。若并没有必要关闭数据库,那个么打开数据库一次,就像。。

将此代码添加到default.js文件

var myDatabase; //Global Variable
var dbPath = Windows.Storage.ApplicationData.current.localFolder.path + '''db.sqlite';

//Create Table
          SQLite3JS.openAsync(dbPath).then(function(db) {
        myDatabase=db;
                return db.runAsync('CREATE TABLE Item (name TEXT, price REAL, id INT PRIMARY KEY)');
                });

然后你只需要使用下面的代码

// For Insert
        return myDatabase.runAsync('INSERT INTO Item (name, price, id) VALUES ("'+ array[i].name+'", "48484", 1);

对于阵列

    var dbPromises = [];

    var testArray = [];
    //only for test purpose
    //You can pass your array here directly
    for (var a = 0; a < 300; a++) {

            var obj = {
                name: "Mango"+a,
                price: 100+a,
                id: a
            };
            testArray.push(obj);
    } 
    for (var i = 0; i < testArray.length; i++) {
        var query = 'INSERT OR REPLACE INTO Item (name, price, id) VALUES ("' + testArray[i].name + '",' + testArray[i].price + ',' + testArray[i].id + ')';
        dbPromises.push(globalDatabase.allAsync(query));
    }

WinJS.Promise.join(dbPromises).then(function () {
    debugger;
}, function(err) {
    debugger;
});

以上代码仅用于较小的数组大小。。。bcz插入的时间太长了。。。对于fasst执行,您应该替换低于代码的

 for (var i = 0; i < testArray.length; i++) {

        var val = '("' + testArray[i].name + '",' + testArray[i].price + ',' + testArray[i].id + '),';
        query = query + val;
        if ((i + 1) % 300 == 0 || (i + 1) == testArray.length) {
            query = query.replace(/,$/, "");
            dbPromises.push(globalDatabase.allAsync(query));
            query = 'INSERT OR REPLACE INTO Item (name, price, id) VALUES ';
        }
    }