繁体   English   中英

iOS SQLite3数据库已锁定

[英]iOS SQLite3 database is locked

  1. 我有一个JSON文件,其中包含2000多个数组,并且每个数组中可能有一个包含5个字符串的数组。

  2. 我在一个函数中运行两个for()循环,所以我认为2ed一个将在第一个完成后运行?

    有时会显示以下内容(出现随机数据错误):

    数据库已锁定

    当我执行

     INSERT INTO problemTags(problem_IDIndex)VALUES('93E') 

我使用下面的代码执行我的SQL语句

+ (void)execSqliteWithSQL:(NSString *)sql{
    sqlite3 *sqlite = nil;
    int openResult = sqlite3_open([DBPath UTF8String], &sqlite);
    if(openResult != SQLITE_OK){
        NSLog(@"open DB error");
    }
    char *error;
    int execResult = sqlite3_exec(sqlite, [sql UTF8String], nil, nil, &error);
    if(execResult != SQLITE_OK){
        NSString *errorString = [NSString stringWithFormat:@"\n execResult error=>\n %s \n SQL:\n%@\n",error,sql];
        NSLog(@"%@",errorString);
    }
    sqlite3_close(sqlite);
}

我在想这个问题的原因是,当我运行for循环时,它会向execSqliteWithSQL函数发送一些SQL语句,而当它不能足够快地运行时,数据库是否会关闭?


问题如下:

在不使用线程情况下 ,两个for循环如下所示:

-(void)......{
    for(){
       //sending SQL to execSqliteWithSQL
    }

    for(){
       //sending SQL to execSqliteWithSQL
    }

 }

一些想法:

  1. 您是否可能有多个线程同时调用此execSqliteWithSQL 如果是这样,很可能会出现这样的错误。

    您可以通过设置一个专用的串行队列来补救此问题, execSqliteWithSQL将向其调度调用,从而消除了同时执行此操作的尝试。

  2. 无论如何,我建议不要为每个调用打开和关闭数据库。 效率低下。

    实际上,如果执行一堆更新/插入语句,您不仅不希望为每个调用打开和关闭数据库,还想要打开,调用BEGIN TRANSACTION ,进行更新,然后COMMIT这些更改。 性能差异令人吃惊。

  3. execSqliteWithSQL明确假设您正在手动构建SQL(大概是使用stringWithFormat )。 那充其量是有问题的,最坏的是危险的。 如果在要插入数据库的字符串值中出现引号,则SQL将失败。 如果此提要包含任何用户输入,则容易受到SQL注入攻击。

    相反,您应该使用sqlite3_prepare_v2准备带有?的SQL语句? 占位符,然后使用sqlite3_bind_xxx将值绑定到那些占位符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM