首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用错误代码6写入SQLite

无法用错误代码6写入SQLite
EN

Stack Overflow用户
提问于 2016-06-14 08:44:22
回答 2查看 769关注 0票数 0

我试图从一个跨平台应用程序中写入SQLite数据库,该应用程序使用AngularJS、Monaca和Onsen创建。

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

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

在我的代码中,如果表在尝试编写之前还不存在,我就会创建它。这就是阻塞数据库的原因吗?下面的app.js代码显示数据库进程。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2016-06-16 16:02:53

根据我的常识,您是在定义彼此内部的两个事务时导致阻塞的。

您可以从这一行的数据库中预订事务:

代码语言:javascript
复制
function goInsert() {
   db = window.openDatabase("myDB", "1.0", "My DB", 200000);
   db.transaction(insertDB, errorCB, successCB);  <--- here!!
}

再试试里面的另一个:

代码语言:javascript
复制
// called inside previous function.
function goInsert() {
   db = window.openDatabase("myDB", "1.0", "My DB", 200000);
   db.transaction(insertDB, errorCB, successCB); <-- in here inside the call you make another transaction.
}

因此,数据库是从第一个db.transaction行的事务中保留的,内部函数是在发生另一个db.transaction时导致阻塞的原因。

票数 4
EN

Stack Overflow用户

发布于 2016-06-20 11:20:52

我基本上要从sqlite文档中粘贴一小部分,并解释一下,因为过去我尝试做一个基于SQLite的webapp,并且由于这个特殊的问题,我在最后更改了实现

要写入数据库,进程必须首先获得如上所述的共享锁(如果存在热日志,则可能回滚不完整的更改)。获得共享锁后,必须获取保留锁。保留的锁信号表明进程打算在将来的某个时候写入数据库。一次只有一个进程可以持有保留锁。但是,其他进程可以在保留锁保持时继续读取数据库。

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

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

这是完整的文档https://www.sqlite.org/lockingv3.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37807064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档