离线缓存

  • 为了用户的体验,不需要每次打开App都加载新数据,或者重新请求数据,因此需要把每次浏览的数据保存起来,当下次打开软件时,首先从沙盒中加载数据;或者当软件未联网时,也只能从沙盒中加载旧数据。

离线数据的方法选择

  • 1.plist文件
  • 2.Document路径
  • 3.数据库
由于保存的是大批量数据,且会不停的刷新新数据,因此应该选择数据库来存储。

离线缓存的思路

  • 当第一次打开应用程序时,把界面加载好的数据保存到沙盒中
  • 当下一次进入应用程序时,首先从沙盒中找
    • 如果没有网络,直接加载上次保存的数据,或者没有比较新的数据也从沙盒中加载数据。

需要缓存的数据如何保存

  • sqlite3 框架FMDB

操作数据库的工具类

static FMDatabase *_db;
+ (void)initialize
{
// 1.打开数据库
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"statuses.sqlite"];
_db = [FMDatabase databaseWithPath:path];
[_db open]; // 2.创表
// 表中有三列,一个是主键,另一个是数据对象的id,一个是数据对象
[_db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_status (id integer PRIMARY KEY, status blob NOT NULL, idstr text NOT NULL);"];
}
保存到沙盒中得数据库中
+ (void)saveStatuses:(NSArray *)statuses
{
// statuses是字典数组
// 要将一个对象存进数据库的blob字段,最好先转为NSData
// 一个对象要遵守NSCoding协议,实现协议中相应的方法,才能转成NSData
for (NSDictionary *status in statuses) {
// NSDictionary --> NSData
NSData *statusData = [NSKeyedArchiver archivedDataWithRootObject:status];
[_db executeUpdateWithFormat:@"INSERT INTO t_status(status, idstr) VALUES (%@, %@);", statusData, status[@"idstr"]];
}
}
从数据库中取出缓存数据
+ (NSArray *)statusesWithParams:(NSDictionary *)params
{
// 根据请求参数生成对应的查询SQL语句
NSString *sql = nil;
// params[@"since_id"] 上拉刷新的标识
if (params[@"since_id"]) {
sql = [NSString stringWithFormat:@"SELECT * FROM t_status WHERE idstr > %@ ORDER BY idstr DESC LIMIT 20;", params[@"since_id"]];
} else if (params[@"max_id"]) { // 下拉刷新
sql = [NSString stringWithFormat:@"SELECT * FROM t_status WHERE idstr <= %@ ORDER BY idstr DESC LIMIT 20;", params[@"max_id"]];
} else { // 第一次加载的时候
sql = @"SELECT * FROM t_status ORDER BY idstr DESC LIMIT 20;";
} // 执行SQL
FMResultSet *set = [_db executeQuery:sql];
NSMutableArray *statuses = [NSMutableArray array];
while (set.next) {
NSData *statusData = [set objectForColumnName:@"status"];
NSDictionary *status = [NSKeyedUnarchiver unarchiveObjectWithData:statusData];
[statuses addObject:status];
}
return statuses;
}

最新文章

  1. 【MySQL】Create table 以及 foreign key 删表顺序考究。
  2. 封装ios静态库碰到的一些问题(二)
  3. JS数组添加字典的方法
  4. js打印功能
  5. 对Json字符串进行格式化显示
  6. PHP的语言规范
  7. codeigniter nginx rewrite规则配置【转】
  8. Little Kings
  9. jq插件处女座 图片轮播
  10. RSA简介(二)——模幂算法
  11. 利用content为伊特元素追加三个小点
  12. 面向对象(特殊成员 组合 self)
  13. NIO(三)
  14. SHOW Syntax
  15. 一针见血tomcat
  16. CSS如何作小于1PX的边
  17. 《mysql从入门到精通》提高
  18. 02-Maven安装配置
  19. Hadoop生态圈-Kafka的新API实现生产者-消费者
  20. Flask:cookie 和 session (0.1)

热门文章

  1. Struts2中ValueStack结构和总结
  2. Spring Security调研记录【七】--核心模型与实现
  3. 设计模式-(8)外观(swift版)
  4. Android沉浸式状态栏(透明状态栏)最佳实现
  5. C# Stopwatch
  6. java 泛型的理解与应用
  7. Go语言web框架 gin
  8. sqlserver2008Mail
  9. python名片管理系统V2
  10. bzoj 3677: [Apio2014]连珠线【树形dp】