最近在项目中用到了FMDB框架下的本地数据库搭建,感觉非常方便,在学习使用的同时,写下这篇文章做个总结:
首先,将框架导入需要使用的类中
#import "fmdb/FMDB.h"
然后在项目中添加libzsqlite3.tbd
完成以上任务后就可以正式开始使用FMDB框架啦。
关于FMDB的基础教程,可以参考:http://blog.csdn.net/jiarusun000/article/details/7740170,由于讲述FMDB基础操作的文章网上太多,所以在次不再赘述。
下面主要讲的是我自己使用FMDB时感觉需要注意的地方。
首先是FMBD用来存储数据模型。
在iOS开发中数据转模型是非常常用的方法,但是数据库本身是不支持存储模型数据的,所以我们如果想将数据模型存入FMDB中需要费些周折。首先,数据库是支持存储二进制文件的,数据类型为blod。
所以如果想要将数据模型存储进数据库中就需要先将数据模型转化为二进制文件,也就是NSData,很巧,我们知道归档可以做到这些,所以首先要做的就是将模型归档,然后转化为NSData格式,再将NSData格式的数据模型存入数据库中即可,同样的,从数据库中取出数据后也要进行反归档,然后才能变为数据模型。
代码如下:
FMDatabase *db = [FMDatabase databaseWithPath:SQL_PATH];
NSString *sql;
if ([db open]) {
sql = @"create table if not exists historyTable(id integer primary key autoincrement,comic blob not null, comicSet blob not null unique,comicSetName varchar not null unique)";
bool res = [db executeUpdate:sql];
if (res) {
debugLog(@"历史表格创建成功");
} else {
debugLog(@"历史表格创建失败");
}
sql = @"select id from historyTable where comicSetName = ?";
FMResultSet *rs = [db executeQuery:sql,self.comicSet.name];
if ([rs next]) return;
sql = @"insert into historyTable(comic,comicSet,comicSetName) values(?,?,?)";
NSData *comicData = [NSKeyedArchiver archivedDataWithRootObject:self.comic];
NSData *comicSetData = [NSKeyedArchiver archivedDataWithRootObject:self.comicSet];
res = [db executeUpdate:sql,comicData,comicSetData,self.comicSet.name];
if (res) {
debugLog(@"历史数据插入成功");
} else {
debugLog(@"历史数据插入失败");
}
[db close];
}
在将数据模型存入数据库中是,还有其他许多雷点,例如:
当没有存储数据的OC自带数据类型被归档存入数据库再取出时,其本身不再指向某片空间,需要重新alloc,init,不然无法使用,需要注意。
还有,就是当需要存入数据库中的数据不是对象而是基础数据类型时,需要使用格式输出的方法,不然会出现错误,程序无法运行!!!
[db executeQueryWithFormat:];
目前网上流传的FMDB使用方法的教程讲的都太少,如果有时间,我会尽力写一篇比较详细完善的FMDB常用方法的教程,希望不要成为有生之年系列。。。
select ‘comic’,‘comicSet’ from historyTable order by ‘id’ desc 降序排列
select ‘comic’,‘comicSet’ from historyTable order by ‘id’ asc 升序排列
获取当前数据库中数据条数
NSString *sql = @"select count(id) from historyTable";
NSInteger idCount = 0;
idCount = [db intForQuery:sql];
删除数据库中前5条数据
sql = [NSString stringWithFormat:@"delete from historyTable where id in (select id from historyTable order by id asc limit %i)",idCount - 20];
BOOL res = [db executeUpdate:sql];