FMDB框架中重要的类:
1、FMDatabase
FMDatabase代表一个单独的SQLite数据库,用来执行SQL语句。FMDatabase线程不安全,如果在多个线程中同时使用FMDatabase,会造成数据混乱。
2、FMResultSet
使用FMResultSet执行查询后的结果集。
3、FMDatabaseQueue
用于多个线程中执行多个查询和更新的,它是线程安全的。
FMDB增删改查:
面试的时候着实被自己坑了一把,说会什么数据库,结果增删改查语句说错三个,真是丢人,现在补上吧:
增:(Insert)
insert [into] <表名> (列名) values (列值)
例:insert into Strdents (姓名,性别,出生日期) values ('开心朋朋','男','1980/6/15')
删:(delete)
delete from <表名> [where <删除条件>]
例:delete from a where name='开心朋朋'(删除表a中列值为开心朋朋的行)
改:(update)
update <表名> set <列名=更新值> [where <更新条件>]
例:update tongxunlu set 年龄=18 where 姓名='蓝色小名'
查: (select)
select <列名> from <表名> [where <查询条件表达试>] [order by <排序的列名>[asc或desc]]
链接:https://www.cnblogs.com/daxueshan/p/6687521.html
FMDB使用须知:
1、多线程不能共享一个FMDatabase对象,也不能在多线程下同时创建多个FMDatabaseQueue实例来操作同一个数据库,这样可能会造成数据的操作丢失。
2、FMDB是sqlite的封装,而文件数据sqlite在同一时刻允许多个线程、进程读,但是同一时刻不允许多个线程写。
为什么会死锁?
答:在进行写操作时,数据库会被锁定,此时任何其他读、写操作都会被阻塞,如果阻塞超过5秒(默认是5秒,重新编译sqlite可以修改超时时间),就报“database is locked”错误。
3、FMDatabaseQueue解决多线程问题的思路
创建一个队列。然后将需要执行的数据库操作放到block中,队列中的block按照添加进队列的顺序依次执行,实际上还是同步的操作,避免了多个线程对数据库的访问。
要点:
1、执行大批量的数据更新时,最好使用inTransaction事物,这样效率更高,因为它是先将数据存储到内存中,之后批量存储到数据库文件中。如果是inDatabase的话,会反复的打开文件关闭文件,非常耗时。所以效率不高。
详细原因:
原因就是它以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。可是如果我们用事物的形式提交,开始事务后,进行的大量操作语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。
2、如果UI上不需要在更新数据时产生交互,可以将FMDatabaseQueue放入一个子线程中异步执行,这是一个不错的选择。
3、如果非必须一次性的、完整性的大批量数据,可以将数据批量拆分,在进行存储,这样能有效的避免长时间阻塞。
SQLite存储数据类型:
1、integer:整形值
2、real:浮点值
3、text:文本字符串
4:blob:二进制数据(比如文件)
实际上SQLite是无类型的,就算是存储字符串文本(主键除外),建表时声明类型或者不声明类型都可以,只是为了编程规范,方便阅读和交流,我们最好加上每个字段的具体类型。
主键约束:
使用场景:
为了区分相同字段的数据,让记录的每一条数据具有唯一性,所以,增加主键约束。也就是说每张表必须有一个主键,来标识记录的唯一性。
主键特性:
主键是一直增长的,它可以理解为一个人的身份证,这个人挂掉了,但是这个身份证不会被新的数据使用,新的数据会生成自己的主键(身份证)。
事务简介:
1、简介:
事务(Transaction)是并发控制的基本单位。它是一个操作序列,这些序列要么都执行,要么都不执行,它是一个不可分割的工作单位。例如转账,从一个账号扣款另一个账号赠款,这两个操作要门都执行,要么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据的一致性。
2、事务的四个基本特征:
原子性:事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。
一致性:只有合法的数据才会被写入到数据库,否则事物将其回滚到最初状态。
隔离性:事务允许多个用户对同一个数据进行并发访问而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其它事物的修改互相独立。
持久性:事物结束后,事务处理的结果必须能够得到固化,也就是真实修改了数据库。
总结:
1、FMDatabaseQueue看似是一个队列,但其实并不是,它通过内部创建一个Serial的dispatch_queue_t来处理通过inDatabase和inTransaction传入的Blocks,所以当我们在主线程(或后台)调用inDatabase和inTransaction时,代码实际上是同步的,这样就避免了多个线程同时访问数据库的问题。
2、如果在后台有大量的更新操作时,主线程有需要执行少量的数据库操作,那么在后台操作执行完之前,它还是需要等待,此时会阻塞主线程。
在项目中的实际应用:
李明杰详细PPT详细介绍:https://pan.baidu.com/s/1xNqIA1zPhpAh1-mqk1e6uw
项目使用代码:https://pan.baidu.com/s/1dexSqWu9BYKLMGWZ6eoRig 密码: 8gvq