XZ_iOS之实现离线缓存
来源:互联网 发布:win7电脑优化软件 编辑:程序博客网 时间:2024/06/05 02:35
离线缓存的实现思路:从沙盒中加载缓存的数据,如果有缓存,直接从沙盒加载缓存的数据,如果没有缓存,发送请求给服务器,然后展示服务器返回的数据,并将返回的数据缓存到沙盒中。
使用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;
}
- XZ_iOS之实现离线缓存
- XZ_iOS中清除缓存的实现
- XZ_iOS之使用textView实现占位文字
- XZ_iOS之block实现逆向传值
- XZ_iOS之自定义弹幕的实现
- Retrofit 源码解读之离线缓存策略的实现
- Retrofit 源码解读之离线缓存策略的实现
- Retrofit 源码解读之离线缓存策略的实现
- XZ_iOS之使用GCD实现发送验证码
- XZ_iOS之使用webView实现开机动画效果
- XZ_iOS之实现点击某个按钮退出app
- WebView实现离线缓存阅读
- iOS FMDataBase 实现离线缓存
- 使用NSURLProtocol实现离线缓存
- HTML5之离线应用缓存
- HTML5之离线应用缓存
- hybird架构之离线缓存
- Android离线之文件缓存
- js中!!的作用
- 校园极速卡客户端出现的问题
- 《第一行代码》 随手笔记——第三章 UI开发的点点滴滴
- git rebase简介(高级篇)
- Java容器
- XZ_iOS之实现离线缓存
- 运维工具注册码
- Uva10603——Fill
- html5学习(1):插入图片|设置颜色|嵌入搜索|设置字体
- Android---获取手机联系人及归属地
- ActiveMQ实现负载均衡+高可用部署方案
- Java NIO vs. IO
- poj 2431 Expedition(优先队列+贪心)(北邮新生赛2016H)
- 第三周上机实践项目——项目4-穷举法解决组合问题