sqlite数据库支持的数据类型有NULL,INTEGER,REAL,TEXT,BLOB.不支持字典和数组、枚举等自定义类型。
sqlite中alter功能只能alter 只能用来修改表名,新增列到现有表中。不支持现有列的重命名、删除和修改。
如果想要执行这些操作:
1.创建一个拥有正确结构的临时表 tableName_tmp
2.把旧表的主键插入到新表
3.根据主键,把所有的数据从旧表更新到新表
4.修改新表
5.删除旧表
6.将新表改名为旧表
sqlite会自动维护一个系统表sqlite_master,该表存储了我们所创建的各个table、view、trigger等等信息。
sqlite_master表的字段:
type类型,取值一般是table、view
name:
tbl_name:表名
rootpage:
sql:创建表或者视图的sql语句,可以从该sql语句判断某个字段是否存在。
sqlite_master表结构:
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句
FMResultSet使用FMDatabase执行查询后的结果集
FMDatabaseQueue用于在多线程中执行多个查询或更新,它是线程安全的。
在多个线程中同时使用一个FMDatabase实例是不明智的。
现在你可以为每 个线程创建一个FMDatabase对象,不要让多个线程分享同一个实例,他无 法在多个线程中同事使用。
否则程序会时不时崩溃或者报告异常。所以,不要 初始化FMDatabase对象,然后在多个线程中使用。
这时候,我们就需要使 用FMDatabaseQueue来创建队列执行事务。
但是对数据的操作最重要的还是安全问题,当多个线程对数据库进行操作的时候,一定会出问题的,
笔者遇到的问题是,当向数据库插入大量的数据时,如果再去做查询操作,插入操作会中断,甚至引起程序崩溃。
那么FMDB对于解决线程安全问题的方法是引入FMDatabaseQueue,该队列是一个串行队列,加入该队列的线程会按顺序执行,避免多个线程同时操作数据库,FMDatabaseQueue也很好用:
queue [FMDatabaseQueuedatabaseQueueWithPath:database_Path]; //创建队列
然后直接调用 - (void)inDatabase:(void (^)(FMDatabase *db))block 方法即可,该方法采用block回调,可以直接对db执行操作。但是在开发的过程中极易造成死锁,
如果出现"inDatabase: was called reentrantly on the same queue, which would lead to a deadlock",就说明在工程中有嵌套执行任务,即在inDatabase方法中又调用了该方法,造成了死锁