Javascript 无法写入SQLite,错误代码为6

Javascript 无法写入SQLite,错误代码为6,javascript,angularjs,database,sqlite,Javascript,Angularjs,Database,Sqlite,我正在尝试从使用AngularJS、Monaca和Onsen UI创建的跨平台应用程序写入SQLite数据库 我有一个用户输入用户名和密码的视图。我阅读了这些详细信息,并将它们保存到一个服务中,以后可以使用getter和setter访问它们 但是,当我尝试从保存的服务值将详细信息写入SQLite数据库时,会得到一个错误代码6。根据,错误代码6表示数据库已锁定。为什么数据库会被锁定?如果数据库被锁定/解锁,如何向其写入值 在我的代码中,如果表在尝试写入之前不存在,我将创建该表。这就是阻塞数据库的原

我正在尝试从使用AngularJS、Monaca和Onsen UI创建的跨平台应用程序写入SQLite数据库

我有一个用户输入用户名和密码的视图。我阅读了这些详细信息,并将它们保存到一个服务中,以后可以使用getter和setter访问它们

但是,当我尝试从保存的服务值将详细信息写入SQLite数据库时,会得到一个错误代码6。根据,错误代码6表示数据库已锁定。为什么数据库会被锁定?如果数据库被锁定/解锁,如何向其写入值

在我的代码中,如果表在尝试写入之前不存在,我将创建该表。这就是阻塞数据库的原因吗?下面是Myapp.js代码,用于显示数据库进程

var db;
document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() {
    db = window.openDatabase("myDB", "1.0", "My DB", 200000);
    db.transaction(createDB, errorCB, successCB);
}

function createDB(tx) {
    tx.executeSql('CREATE TABLE IF NOT EXISTS tb_remember_me (id INTEGER PRIMARY KEY, name)');
}

// User clicks the "login" button =- write details to Database
$scope.validateLogin = function () {
    // Open DB and write to it
    db = window.openDatabase("myDB", "1.0", "My DB", 200000);
    db.transaction(goInsert, errorCB, successCB);
};

function goInsert() {
    db = window.openDatabase("myDB", "1.0", "My DB", 200000);
    db.transaction(insertDB, errorCB, successCB);
}

function insertDB(tx) {
    // Get the User entered details from Shared Service    
    $userID = SharedProperties.getUserID(); // WORKING
    $userPIN = SharedProperties.getUserPIN(); // WORKING

    tx.executeSql('INSERT INTO tb_remember_me (id, name) VALUES (?,?)', [$userID, $userPIN]); // Error generated here
}

// Transaction error callback
function errorCB(err) {
    alert("Error processing SQL with ERROR CODE: " + err.code);
}

// Transaction success callback
function successCB() {
    return true;
}

根据我的常识,您在定义彼此内部的两个事务时造成了障碍

您可以从此行的数据库中保留事务:

function goInsert() {
   db = window.openDatabase("myDB", "1.0", "My DB", 200000);
   db.transaction(insertDB, errorCB, successCB);  <--- here!!
}
函数goInsert(){
db=window.openDatabase(“myDB”、“1.0”、“myDB”,200000);

事务(insertDB,errorCB,successCB);根据我的常识,您在定义彼此内部的两个事务时造成了阻塞

您可以从此行的数据库中保留事务:

function goInsert() {
   db = window.openDatabase("myDB", "1.0", "My DB", 200000);
   db.transaction(insertDB, errorCB, successCB);  <--- here!!
}
函数goInsert(){
db=window.openDatabase(“myDB”、“1.0”、“myDB”,200000);

transaction(insertDB,errorCB,successCB);我基本上要从sqlite文档中粘贴一小部分,并对其进行一些解释,因为在过去,我曾尝试创建一个基于sqlite的webapp,但由于这个特殊的问题,我最终更改了实现

要写入数据库,进程必须首先获取如上所述的共享锁(如果有热日志,可能会回滚未完成的更改)。获取共享锁后,必须获取保留锁。保留锁表示进程打算在将来某个时间写入数据库。一次只能有一个进程可以持有保留锁。但其他进程可以在持有保留锁的同时继续读取数据库

正如它所说的,SQLite不能同时执行两个写事务,这会使数据库进入锁定模式(有时是永久的,唯一的解锁方法是通过复制粘贴文件)

因此,您无法使用同一个SQLite文件创建多用户应用程序。如果您创建的文件是每个用户的,则必须创建一种机制,在启动新的事务之前,该机制将实际等待事务完成


这是完整的文档

我基本上要从sqlite文档中粘贴一小部分,并对其进行一些解释,因为在过去,我曾尝试制作一个基于sqlite的webapp,但由于这个特殊问题,我在最后更改了实现

要写入数据库,进程必须首先获取如上所述的共享锁(如果有热日志,可能会回滚未完成的更改)。获取共享锁后,必须获取保留锁。保留锁表示进程打算在将来某个时间写入数据库。一次只能有一个进程可以持有保留锁。但其他进程可以在持有保留锁的同时继续读取数据库

正如它所说的,SQLite不能同时执行两个写事务,这会使数据库进入锁定模式(有时是永久的,唯一的解锁方法是通过复制粘贴文件)

因此,您无法使用同一个SQLite文件创建多用户应用程序。如果您创建的文件是每个用户的,则必须创建一种机制,在启动新的事务之前,该机制将实际等待事务完成


这是完整的文档

事务的思想是确保在数据库中打开一个时不会执行任何其他操作。现在,您尝试将第二个作为内部操作打开,但它们的工作方式不同。一旦打开一个,另一个将阻塞数据库,正如您所观察到的那样。我删除了打开数据库的额外调用,但仍然会得到相同的错误r、 我想知道,因为这些是异步调用,我是否需要添加$timeout()也许…我会集中精力删除在另一个db.transaction回调中使用db.transaction的方法。这些方法会影响锁。事务的想法是在一个打开时在db中不做任何其他操作。现在您尝试打开第二个作为内部事务的方法,但它们不能像那样工作。一旦一个打开,另一个JU就会出现正如您所观察到的,t阻塞了db。我删除了打开数据库的额外调用,但仍然得到了相同的错误。我想知道,因为这些是异步调用,我是否需要添加$timeout()。也许……我会集中精力删除在另一个这样的db.transaction回调中使用db.transaction的方法。这些方法会影响锁。