Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/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 在多线程Objective-C中使用SQLite的最佳方法_Ios_Objective C_Multithreading_Sqlite - Fatal编程技术网

Ios 在多线程Objective-C中使用SQLite的最佳方法

Ios 在多线程Objective-C中使用SQLite的最佳方法,ios,objective-c,multithreading,sqlite,Ios,Objective C,Multithreading,Sqlite,我在应用程序中使用Sqlite作为后端。我有些困惑。我使用一个类来使用Sqlite,比如DatabaseManager。在这个类中,我已经声明了从DB访问数据的所有方法都是静态的。在多线程处理中,使所有方法都是静态的好吗?或者DatabaseManager应该是单例类还是普通类 我面临的问题是,一个线程在使用后关闭数据库,而另一个线程也在访问数据库,这两个线程之间,然后应用程序崩溃,并显示消息“过量坏” 我将NSOperationQueue和NSOperation用于多线程而不是GCD。这样,如

我在应用程序中使用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是否已使用多线程支持编译,或者自己提供同步机制。