您的位置:首页 > 移动开发 > IOS开发

XZ_iOS之实现离线缓存

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

使用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)"];

}

/**

 *  存储数据到沙盒中

 *

 *  @param shops 需要存储的数据

 */

+ (void)saveShops:(NSArray *)shops {

    for (NSDictionary *shop in shops) {

        // 要将一个对象存进数据库的blob字段,最好先转为NSData

        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:shop];

// 存储的时候直接存储NSData类型

        [_db executeQueryWithFormat:@"insert
into t_shop(shop,idStr) values(%@, %@);",data,shop[@"idStr"]];

    }

}

/**

 *  根据请求参数去沙盒中加载缓存的数据

 *

 *  @param params 请求参数

 */

+ (NSArray *)shopsWithParams:(NSDictionary *)params {

   
// 根据请求参数生成对应的查询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];

       [shops addObject:shop];

    }

    return shops;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: