[英]iOS SQLite3 database is locked
我有一个JSON文件,其中包含2000多个数组,并且每个数组中可能有一个包含5个字符串的数组。
我在一个函数中运行两个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
}
}
一些想法:
您是否可能有多个线程同时调用此execSqliteWithSQL
? 如果是这样,很可能会出现这样的错误。
您可以通过设置一个专用的串行队列来补救此问题, execSqliteWithSQL
将向其调度调用,从而消除了同时执行此操作的尝试。
无论如何,我建议不要为每个调用打开和关闭数据库。 效率低下。
实际上,如果执行一堆更新/插入语句,您不仅不希望为每个调用打开和关闭数据库,还想要打开,调用BEGIN TRANSACTION
,进行更新,然后COMMIT
这些更改。 性能差异令人吃惊。
此execSqliteWithSQL
明确假设您正在手动构建SQL(大概是使用stringWithFormat
)。 那充其量是有问题的,最坏的是危险的。 如果在要插入数据库的字符串值中出现引号,则SQL将失败。 如果此提要包含任何用户输入,则容易受到SQL注入攻击。
相反,您应该使用sqlite3_prepare_v2
准备带有?
的SQL语句?
占位符,然后使用sqlite3_bind_xxx
将值绑定到那些占位符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.