FMDB基本概念

数据库是存放数据的仓库,存放的是多张的表,类似于Excel,数据以表格的形式展现。常见的数据库:有sqlite, MySQL, SQLServer, Oracle, Access等

FMDB使用的sqlite。sqlite具有灵活小巧,可移植性高的特点。而Mysql一般使用在大型的商业项目中。而libsqlite3是对sqlite数据库进行操作的系统库,也就是系统级别的api,而FMDB就是对libsqlite3中的api进行了封装实现了一些数据库常用的增删改查等功能

FMDB基本框架

FMDB主要功能为:

  • 数据库的创建
  • 更新语句
  • 查询语句
  • 数据库的开关(连接和断开)
  • 数据库的线程问题

FMDB基本框架及其思维导图如下:

FMDB思维导图
FMDB的线程处理逻辑

首先,SQLite是文件型数据库,其机制也和文件基本类似,也就是 写独占,读共享。FMDB本质上只是保证了使用sqlite时的线程安全而并没有实现读共享的功能(至于为什么,怎么实现?),其代码处理如下:

[self.queue inDatabase:^(FMDatabase * _Nonnull db) {// 这里是replae语句的相关方法[self addDataFrom:0 count:1000];}];

其本质是:

dispatch_sync(_queue, ^() {FMDatabase *db = [self database];block(db);});

而_queue是在初始化FMDatabaseQueue时生成的一个串行队列,其主要逻辑是:

_queue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL);

备注:
这里的串行队列不能使用主队列,因为使用主队列会形成相互阻塞的问题。

sqlite多线程模式的定义是:同一个数据库连接不能同时在多个线程中使用。其关键点是“同时”,经测试,同一个连接可以再多个线程中使用,比如在线程1open,在线程2insert,再在线程3close,但是不能同时使用,否则会崩溃。

多线程的目的就是并发,如果不是同时使用同一个连接,并发就失去了意义。所以本质上来讲,sqlite3并不支持并发读取,只支持并发读或者单个写。FMDB也建议不要在多个线程中同时使用一个FMDatabase对象就是这个原理。

sqlite3除了能在编译阶段设置线程模式,还可以在open的时候有条件的设置线程模式,但是FMDB除了openWithFlag外,并没有提供这个接口,为了避免这个问题,FMDB提供了上述的FMDBQueue来将任务放到一个串行队列中串行处理,这也就实现了强行的串行模式下访问数据库。

综上所述:FMDB的线程处理就是强行将所有的多线程逻辑在一个串行队列中同步处理。

更多文章

iOS数据库的使用(一):FMDB多线程相关推荐

  1. ios mysql数据库查询语句_ios fmdb数据库查询语句

    iOS开发数据库篇-FMDB简单介绍 iOS开发数据库篇-FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语 ...

  2. iOS 数据库操作(使用FMDB)

    iOS 数据库操作(使用FMDB)   iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...

  3. IOS数据库操作SQLite3使用详解(转)

    iPhone中支持通过sqlite3来访问iPhone本地的数据库. 具体使用方法如下 1:添加开发包libsqlite3.0.dylib 首先是设置项目文件,在项目中添加iPhone版的sqlite ...

  4. IOS数据库操作SQLite3使用详解

    sqlite数据库iosdatabasesqlinteger 目录(?)[+] iPhone中支持通过sqlite3来访问iPhone本地的数据库. 具体使用方法如下 1:添加开发包libsqlite ...

  5. iOS数据库操作之FMDB

    SQLite一种轻量级关系数据库,在嵌入式系统中使用比较广泛. 在iOS中使用SQLite需要添加库libsqlite3.0.dylib,并引入头文件#import <sqlite3.h> ...

  6. iOS 数据库-SQLite3 CoreData FMDB

    在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储,包括偏 ...

  7. 使用FMDB多线程訪问数据库,及database is locked的问题

    今天最终攻克了多线程同一时候訪问数据库时,报数据库锁定的问题.错误信息是: Unknown error finalizing or resetting statement (5: database i ...

  8. ios mysql 修改数据,iOS数据库FMDB--增删改查(模糊查询)实写记录

    在iOS中,主要有5种数据缓存的策略: 1.plist 2.归档 3.偏好设置 4.沙盒文件 5."SQLite数据库" 其中,"SQLite数据库" 是最常用 ...

  9. iOS数据库框架 WCDB的使用详解

    WCDB是一个高效.完整.易用的移动数据库框架,基于SQLCipher,支持iOS, macOS和Android. 前几年的项目用到的数据库框架,都是FMDB.从最初的摸索到工具类的封装,也是经历了一 ...

  10. Sqlite3数据库之第三方库FMDB学习心得

    很早之前就接触Sqlite数据库,但是之前对数据库操作未使用任何第三方库,只是实现基本的增.删.改.查功能,自己对着一本iPhone开发入门级的书籍写了一个类,基本能实现上述四个功能.最近在开发一个软 ...

最新文章

  1. 2021年深度学习哪些方向比较有研究潜力?
  2. ORACLE 配置文件
  3. Linux shell编程学习实例与参数分析(一)
  4. UML基础教程(内部使用教程) 非常不错的ppt!!强烈推荐
  5. 类DefaultWsdl 11定义中英文对比API文档
  6. 详解Framework
  7. TK:vtkCellTreeLocator用法实战
  8. HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo
  9. 解决python中TypeError: not enough arguments for format stringj
  10. 头文件 ctype.h 以及函数 isalpha() tolower()
  11. Google Cloud
  12. 图像处理_描述下SIFT特征?(清晰易懂)
  13. 道路-水系河流-铁路-人口等栅格数据获取途径
  14. 通俗理解动态库与静态库区别
  15. Tensorflow - 训练中出现 Nan 值
  16. 邓应海:3.24最新黄金走势分析,黄金多空操作建议
  17. 人力资源外包(HRO)服务市场现状研究分析-
  18. 随想录·算一算买车的账
  19. C++图形化编程(时钟案例)
  20. 谈一谈光伏逆变器及其发展趋势

热门文章

  1. 数据库优化java设计模式架构 策略 责任链
  2. 常见springboot依赖包关系
  3. xxl-job架构源码解析
  4. LinkedList类源码阅读
  5. 设计模式 (十八 ) 观察者模式
  6. CountDownLatch源码解读
  7. 业务重点-实现一个简单的手机号码验证
  8. 解析大型.NET ERP系统 自动更新
  9. ubuntu 14.04 32bit依赖库解决
  10. 如何利用极致业务基础平台构建一个通用企业ERP之十三盘点单设计