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;
}
使用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;
}
相关文章推荐
- iOS多线程的初步研究(三)-- NSRunLoop
- iOS的三种多线程技术
- iOS开发中常用的几种设计模式
- 第一个iOS程序简单计算器设计-用到View,get点语法
- iOS 多线程 NSthread的简单使用——iOS 编码复习(六)(多线程4)
- IOS调试—断点调试
- iOS开发两个距离较近的按钮同时触发事件的解决方法
- iOS之04-方法的声明和实现
- ios 图片的两种加载方式
- iOS之03-类的合理设计
- ios数据存储(一)
- ios开发中的基本设计模式(代理,观察者,MVC,单例,策略,工厂,MVVM,原型,Target-Action,通知(notification)机制)
- iOS之02-第一个OC的类
- iOS开发--打印NSRange,CGRect,CGPoint等结构体
- iOS中MD5加密
- Image I/O
- iOS导航栏颜色,任务栏颜色
- iOS_崩溃日志分析(定位崩溃代码)
- 增强版——Firemonkey运行时更改锁定iOS显示方向
- ios layout相关方法