对FMDB进行了一些小的封装,在开发中更加的方便使用。

iOS本地缓存数据方式有五种:
1.直接写文件方式:可以存储的对象有NSString、NSArray、NSDictionary、NSData、NSNumber,数据全部存放在一个属性列表文件(*.plist文件)中。
2.NSUserDefaults(偏好设置),用来存储应用设置信息,文件放在perference目录下。
3.归档操作(NSkeyedArchiver),不同于前面两种,它可以把自定义对象存放在文件中。
4.coreData:coreData是苹果官方iOS5之后推出的综合型数据库,其使用了ORM(Object Relational Mapping)对象关系映射技术,将对象转换成数据,存储在本地数据库中。coreData为了提高效率,甚至将数据存储在不同的数据库中,且在使用的时候将本地数据放到内存中使得访问速度更快。我们可以选择coreData的数据存储方式,包括sqlite、xml等格式。但也正是coreData 是完全面向对象的,其在执行效率上比不上原生的数据库。除此之外,coreData拥有数据验证、undo等其他功能,在功能上是几种持久化方案最多的。
5.FMDB:FMDB是iOS平台的sqlite数据库框架,FMDB以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码,对比苹果自带的Core Data框架,更加轻量级和灵活,提供了多线程安全的数据库操作方法,有效地防止数据混乱。
各种存储方式都有适合的应用场所。这里选用FMDB。对于要存储的数据ModelA,我们会建一个表,然后根据属性建字段,来存储ModelA。如果再有ModelB,再创建一个表,来存储。而我们开发中有很多页面,每个页面展示的又是不同的Model,我们需要建大量的表,CoreData在这方面就非常的方便。
不过CoreData创建也有点麻烦,有没有一种通用的方式来存储这些Model呢。把Model序列化一下,转化为NSData存起来。不过序列化又很麻烦。对于不同的model有不同的属性,在网络请求返回之后,我们可以直接把json字符串存储起来,取出缓存时再进行解析为Model,这样就可以找到一种通用的模式来存储。我们只需要建一张表,查询的key和存储的数据data。主要方法如下
- (void)insertResponseData:(NSData *)data withURL:(NSString *)url;根据唯一的url插入数据,url保持唯一即可。
- (void)updateCacheData:(NSData *)data withURL:(NSString *)url;更新此url对应的数据
- (NSArray *)queryDataWithURL:(NSString *)url;根据url查询数据,返回的是一个一个元素的数组。
- (void)createCacheDataTable:(NSString *)tbName 根据传入的表名创建表
- (BOOL)deleteCacheWithURL:(NSString *)url;根据传入的url删除对应的数据
- (void)saveResponseData:(NSData *)data withURL:(NSString *)url;统一处理保存的数据,是插入还是更新
下面是各个方法的实现
- (void)createCacheDataTable:(NSString *)tbName {
if ([self.dbopen]) {
if (![self.dbtableExists:tbName]) {
NSString * sql = [NSStringstringWithFormat:@"CREATE TABLE '%@' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , 'date' text, 'url' text,'data' blob)",tbName];
BOOL res = [self.dbexecuteUpdate:sql];
if (!res) {
NSLog(@"error when creating Cache table");
} else {
NSLog(@"succ to creating Cache table");
}
}
[self.dbclose];
}
else {
NSLog(@"error when open db");
};
}
- (void)saveResponseData:(NSData *)data withURL:(NSString *)url
{
BOOL hasCache = [selfhasCacheDataWithURL:url];
if (hasCache) {
[selfupdateCacheData:data withURL:url];
}
else {
[selfinsertResponseData:data withURL:url];
}
}
- (void)insertResponseData:(NSData *)data withURL:(NSString *)url
{
if ([self.dbopen]) {
NSString *sql = [NSStringstringWithFormat:@"INSERT INTO %@ (date, url, data) VALUES(?,?,?)",self.currentDBTable];
[self.dbexecuteUpdate:sql, [[NSDatedate] description], url, data];
[self.dbclose];
}
}
- (void)updateCacheData:(NSData *)data withURL:(NSString *)url
{
if ([self.dbopen]) {
NSString * sql = [NSStringstringWithFormat:@"update %@ set data=?, date=? where url=?", self.currentDBTable];
if ([self.dbexecuteUpdate:sql, data, [[NSDatedate] description], url]) {
// NSLog(@"更新缓存成功");
}
[self.dbclose];
}
}
- (BOOL)deleteCacheWithURL:(NSString *)url
{
BOOL suc = NO;
if ([self.dbopen]) {
NSString *sql = [NSStringstringWithFormat:@"delete from %@ where url=?",self.currentDBTable];
suc = [self.dbexecuteUpdate:sql, url];
[self.dbclose];
}
return suc;
}
- (NSArray *)queryDataWithURL:(NSString *)url
{
if ([self.dbopen])
{
NSMutableArray *arr = [[NSMutableArrayalloc]init];
NSString * sql = [NSStringstringWithFormat:@"select * from %@ where url=?" ,self.currentDBTable];
FMResultSet * rs = [self.dbexecuteQuery:sql, url];
while ([rs next])
{
CacheModel *model = [[CacheModelalloc]init];
model.date = [rs stringForColumn:@"date"];
model.url = [rs stringForColumn:@"url"];
model.data = [rs dataForColumn:@"data"];
[arr addObject:model];
}
[self.dbclose];
return arr;
}
returnnil;
}


还没有评论,来说两句吧...