一、FMDB的多线程问题
你项目用FMDB吗?你写的数据库类是线程安全的吗?如果不是,希望这篇小文章会对你有点帮助
1、FMDB如何保证多线程处理的数据安全
对于数据操作,最重要的一点就是数据安全的问题,在多线程中,线程安全是数据安全的首要前提,下面谈谈FMDB 是如何对多线程进行处理的。
详情参考:FMDB 中的多线程处理
2、FMDatabaseQueue为何能保证线程安全
在做iOS项目的时候,会用到许多第三方的框架,比如用FMDB来处理数据库的东西。但是FMDatabase并不是线程安全的,当你在不同的线程里同时操作一个Database的时候,就容易产生崩溃。但是好在FMDB提供了一个解决的方法,就是FMDatabaseQueue。通过它来操作数据库就是线程安全的了。
即:FMDB是使用databaseQueue实现数据库操作线程安全
1 | FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:_dbPath]; |
queue inDatabase:的本质如下:

_queue的初始化为:
1 | _queue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL); |
FMDB是怎么处理线程安全的?
综上所述:FMDB的线程处理就是强行就所有的多线程逻辑在一个串行队列中同步处理。
二、FMDB的数据库事务(Database Transaction)
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。简单的来说就是可以同时处理多个数据库操作,并且速度很快。
FMDB是支持数据库事务的。
1 | [queue inTransaction:^(FMDatabase *db, BOOL *rollback) { |
三、为什么要从FMDB迁移到WCDB?
表结构
WCDB 提供了 ORM 的功能,将类的属性绑定到数据库表的字段。在日常实践中,类的属性名和表的字段名通常不一致。因此,WCDB 提供了 WCDB_SYNTHESIZE_COLUMN(className, propertyName, columnName) 宏,用于映射属性名。