转载出处:http://www.jianshu.com/p/36f7e34646a5
FMDB离线缓存
分析微博返回数据:
- 需要加载的微博多,数据量大,不适合用plist和NSCoding这类一次性加载和存储全部数据的方法,使用数据库则可以做到取一部分数据和存一部分的数据
- 由于微博模型多,如果按照后台服务器一样,一个模型建一张表,每个表(如:用户,微博,图片,文字)又相互之间通过外键联系,会导致客户端的数据库过于复杂,所以只建一张表
- 每条微博的字段非常多,在客户端数据库表中也创建相应数量的字段保存数据是不适合的,所以可以在数据库表中只创建一个blob类型的status字段保存每条微博的全部数据
- 每条微博是根据自身字段idstr大小来比较新旧的,把每条微博从数据库取出再取出idstr来比较新旧是不适合的,所以表中还应该增加idstr字段方便查询
- 最终确定建一张表,三个字段:id(系统默认),status,idstr
遇到问题:
如果把NSDictionary字典数据status直接通过[_db executeUpdateWithFormat:@"INSERT INTO t_status(status, idstr) VALUES (%@, %@);", status, status[@"idstr"]];
来存储,就会取不出来。
原因是通过%@来传入字典对象,相当于传入[status description];
,打印类型可以发现取出的是字符串,不是我们预期的字典对象。
解决方法:
把字典用NSData *statusData = [NSKeyedArchiver archivedDataWithRootObject:status];
转成NSData再存入数据库。
取出数据时,用NSDictionary *status = [NSKeyedUnarchiver unarchiveObjectWithData:statusData];
再转成字典。
为什么字典对象能转成NSData类型
字典对象能转成NSData类型的本质是遵守了NSCoding协议,所以如果想要把自定义对象转成NSData类型需要遵守NSCoding协议,实现encodeWithCoder和initWithCoder方法