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
Ios Obj-C和Javascript之间的SQLite锁定错误_Ios_Sqlite_Fmdb - Fatal编程技术网

Ios Obj-C和Javascript之间的SQLite锁定错误

Ios Obj-C和Javascript之间的SQLite锁定错误,ios,sqlite,fmdb,Ios,Sqlite,Fmdb,我有一个 iOS 在UIWebView中使用小技巧/黑客在Objective-C和Javascript之间通信的应用程序 一个SQLite数据库和模式是在启动时使用创建的 当应用程序运行时,Obj-C代码每秒从电路板读取数据,并将数据写入同一SQLite数据库。同样,Javascript每秒都会从数据库中读取并执行一些Javascript来更新UIWebView。因此,DB文件上没有太多负载 在尝试写入DB时,我不时会遇到DB锁定错误(我正在使用它执行所有sql): 该表非常基本,插入代码也同样

我有一个

iOS

UIWebView
中使用小技巧/黑客在Objective-C和Javascript之间通信的应用程序

一个
SQLite
数据库和模式是在启动时使用创建的

当应用程序运行时,
Obj-C
代码每秒从电路板读取数据,并将数据写入同一
SQLite
数据库。同样,Javascript每秒都会从数据库中读取并执行一些Javascript来更新
UIWebView
。因此,DB文件上没有太多负载

在尝试写入DB时,我不时会遇到DB锁定错误(我正在使用它执行所有sql):

该表非常基本,插入代码也同样基本,我只是插入一些浮点值:

NSString*insertSql=@“插入演示2(时间、tc1、tc2、tc3、tc4、hr)值(%f、%f、%f、%f、%f)”;
BOOL内部交易=[[u fmdb beginDeferredTransaction];
如果(!内部传输){
NSLog(@“RLog:错误代码:%d,%@,[[u fmdb lastErrorCode],[u fmdb lastErrorMessage]);
}
BOOL success=[\u fmdb executeUpdateWithFormat:insertSql、time、tc1、tc2、tc3、tc4、hr];
如果(!成功){
NSLog(@“RLog:错误代码:%d,%@,[[u fmdb lastErrorCode],[u fmdb lastErrorMessage]);
}
[_fmdbcommit];
奇怪的是,当我执行一些从一个完全独立的SQLite文件读取的其他操作时,这种情况似乎经常发生,该文件只能从
Obj-C
代码访问(不用于
Obj-C
和JS之间的通信桥)


我不知道为什么或如何用如此少量的读写操作锁定数据库。

如果这些计时器有可能从单独的线程调用或同时运行,那么您可能需要做的就是使用
FMDatabaseQueue
而不是直接使用数据库,即:

例如,将其作为_fmdb的对等方:

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
self.fmdbQueue = queue;
随后:

[_fmdbQueue inDeferredTransaction:(FMDatabase *db, BOOL *rollback) {
    // read data from the db
    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        …
    }

    // write data out
    NSString *insertSql = @"INSERT INTO DEMO2 (time, tc1, tc2, tc3, tc4, hr) VALUES "
    "(%f, %f, %f, %f, %f, %f)";

    BOOL success = [_fmdb executeUpdateWithFormat:insertSql, time, tc1, tc2, tc3, tc4, hr];
    if ( ! success ) {
        NSLog(@"RLog: err code: %d, %@", [_fmdb lastErrorCode], [_fmdb lastErrorMessage]);
        *rollback = YES;
        return;
    }
 }]; // commit will be executed automatically for us if we didn't flip the value of *rollback.
这样,所有读/写操作都将发生,以消除两个操作试图同时运行的可能性

注意:这假设UIWebView(Javascript)没有打开/锁定它。如果是,那么我不确定如何保护它,除非您将db的创建移出javascript(即,全部在Objective C中)

[_fmdbQueue inDeferredTransaction:(FMDatabase *db, BOOL *rollback) {
    // read data from the db
    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        …
    }

    // write data out
    NSString *insertSql = @"INSERT INTO DEMO2 (time, tc1, tc2, tc3, tc4, hr) VALUES "
    "(%f, %f, %f, %f, %f, %f)";

    BOOL success = [_fmdb executeUpdateWithFormat:insertSql, time, tc1, tc2, tc3, tc4, hr];
    if ( ! success ) {
        NSLog(@"RLog: err code: %d, %@", [_fmdb lastErrorCode], [_fmdb lastErrorMessage]);
        *rollback = YES;
        return;
    }
 }]; // commit will be executed automatically for us if we didn't flip the value of *rollback.