离线缓存的实现思路:从沙盒中加载缓存的数据,如果有缓存,直接从沙盒加载缓存的数据,如果没有缓存,发送请求给服务器,然后展示服务器返回的数据,并将返回的数据缓存到沙盒中。

使用FMDB实现而不是使用CoreData的原因:因为FMDB是我们来决定SQL语句怎么写,我们想效率怎样就怎样,比较自由。而CoreData是按照它自己的方式生成SQL语句,所以有时候会生成一堆的SQL语句,导致有些SQL语句不需要写这么多,它也会生成那么多。所以,做一些简单的数据存储的话,数据量不是很大的话可以用CoreData。

FMDB和CoreData的相同点:都是OC封装C语言SQLite3。

                                 不同点:FMDB是非官方的,第三方;需要程序员编写SQL语句。CoreData是苹果官方,不需要程序员编写SQL语句。

封装一个缓存工具类,实现对缓存的存储和读取:

1>首先要先引入libsqlite3.tbd框架和FMDB第三方文件;

2>在工具类中实现两个方法即可,一个是用来读取数据的,一个是用来存储数据的,然后在调用的时候直接传相应的参数进去即可。

3>注意:一个对象要遵守<NSCoding>协议,实现协议中相应的方法,才能转成NSData类型。

4>FMDB的创建:①创建根据路径数据库;②打开数据库;③创建表格。因为只需要创建一次,所以写在initialize中即可。

下面是工具类的具体代码实现:

// 创建数据库
static FMDatabase *_db;
void)initialize {
    // 1、创建数据库
    //  数据库存储路径
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"shop.sqlite"];
    _db = [FMDatabasedatabaseWithPath:path];
    // 2、打开数据库
_db open];
    // 3、创建表格
    [_dbexecuteUpdate:@"CREATE TABLE IF NOT EXIST t_shop (id NSInteger PRIMARY KEY, shop blob NOT NULL,idStr text NOT NULL)"];
 }
 
 /**
 *  存储数据到沙盒中
  *
需要存储的数据
  */
void)saveShops:(NSArray
for (NSDictionary *shop in
        // 要将一个对象存进数据库的blob字段,最好先转为NSData
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:shop];
// 存储的时候直接存储NSData类型
        [_db executeQueryWithFormat:@"insert into t_shop(shop,idStr) values(%@, %@);",data,shop[@"idStr"]];
     }
 }
 
 
 
 
 /**
 *  根据请求参数去沙盒中加载缓存的数据
  *
请求参数
  */
NSArray *)shopsWithParams:(NSDictionary
     // 根据请求参数生成对应的查询SQL语句
NSString *sql =  nil;
if (params[@"since_id"]) {
        //  若指定此参数,则返回比since_id大的数据(即比since_id时间晚的数据),默认为0.
        sql = [NSStringstringWithFormat:@"select * from t_shop where idStr > %@ order by desc limit 20;",params[@"since_id"]];
else if (params[@"max_id"]) {
        sql = [NSStringstringWithFormat:@"select *from t_shop where idStr < %@ order by idStr desc limit 20;",params[@"max_id"]];
else
        sql = @"select * from t_shop order by desc limit 20;";
     }
    //  执行SQL,返回结果集
    FMResultSet *set =  [_dbexecuteQuery:sql];
    NSMutableArray *shops = [NSMutableArrayarray];
while (set.next) {
// 取的时候取到的也是NSData类型
NSData *shopData = [set  objectForColumnName:@"shop"];
// 然后再转成字典类型
        NSDictionary *shop = [NSKeyedUnarchiverunarchiveObjectWithData:shopData];
addObject:shop];
     }
return
 }