Ios 在多线程Objective-C中使用SQLite的最佳方法
我在应用程序中使用Sqlite作为后端。我有些困惑。我使用一个类来使用Sqlite,比如DatabaseManager。在这个类中,我已经声明了从DB访问数据的所有方法都是静态的。在多线程处理中,使所有方法都是静态的好吗?或者DatabaseManager应该是单例类还是普通类 我面临的问题是,一个线程在使用后关闭数据库,而另一个线程也在访问数据库,这两个线程之间,然后应用程序崩溃,并显示消息“过量坏” 我将NSOperationQueue和NSOperation用于多线程而不是GCD。这样,如果需要,我可以取消操作 实际上,在应用程序中有一些计算部分需要数据库中多个表的数据。如果我在主线程中这样做,则需要时间或表格滚动变得不平滑Ios 在多线程Objective-C中使用SQLite的最佳方法,ios,objective-c,multithreading,sqlite,Ios,Objective C,Multithreading,Sqlite,我在应用程序中使用Sqlite作为后端。我有些困惑。我使用一个类来使用Sqlite,比如DatabaseManager。在这个类中,我已经声明了从DB访问数据的所有方法都是静态的。在多线程处理中,使所有方法都是静态的好吗?或者DatabaseManager应该是单例类还是普通类 我面临的问题是,一个线程在使用后关闭数据库,而另一个线程也在访问数据库,这两个线程之间,然后应用程序崩溃,并显示消息“过量坏” 我将NSOperationQueue和NSOperation用于多线程而不是GCD。这样,如
请指导我。SQlite数据库是线程安全的。threadsafe我们的意思是,您可以在不同的线程中同时使用不同的SQLite数据库连接。 在多个线程中同时使用同一个数据库连接从来都不安全 一个好的解决方案是测试SQLITE_BUSY 用于说明解决方案的伪代码:
continueTrying = YES;
while (continueTrying)
{
retval = sqlite_exec(db, sqlQuery, callback, 0, &msg);
switch (retval)
{
case SQLITE_BUSY:
Log("[%s] SQLITE_BUSY: sleeping for a while...", threadName);
sleep a bit... (use something like sleep(), for example) // -> usleep(20);
break;
case SQLITE_OK:
continueTrying = NO; // We're done
break;
default:
Log("[%s] Can't execute \"%s\": %s\n", threadName, sqlQuery, msg);
continueTrying = NO;
break;
}
}
return retval;
另一种解决方案是使用串行队列:
databaseQueue = dispatch_queue_create("com.company.app.yourdatabase", 0);
dispatch_sync(databaseQueue, ^{
// your database activity
});
尝试对FMDB进行改进,这对您有所帮助。同时打开多个数据库似乎是合理的,因此该类既不应是单例的,也不应是静态的。但我只使用一个数据库。静态sqlite3*数据库=nil;//指向数据库的指针,但sqlite3_stmt*语句在每个方法中都是本地的。这样看起来就可以了。只要该类在拥有实例变量/方法方面是正常的,就可以了。如果需要支持多线程,则必须检查sqlite是否已使用多线程支持编译,或者自己提供同步机制。