iOS---数据离线缓存
2024-09-30 16:22:16
离线缓存
- 为了用户的体验,不需要每次打开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;
}
最新文章
- 【MySQL】Create table 以及 foreign key 删表顺序考究。
- 封装ios静态库碰到的一些问题(二)
- JS数组添加字典的方法
- js打印功能
- 对Json字符串进行格式化显示
- PHP的语言规范
- codeigniter nginx rewrite规则配置【转】
- Little Kings
- jq插件处女座 图片轮播
- RSA简介(二)——模幂算法
- 利用content为伊特元素追加三个小点
- 面向对象(特殊成员 组合 self)
- NIO(三)
- SHOW Syntax
- 一针见血tomcat
- CSS如何作小于1PX的边
- 《mysql从入门到精通》提高
- 02-Maven安装配置
- Hadoop生态圈-Kafka的新API实现生产者-消费者
- Flask:cookie 和 session (0.1)