FMDB 是轻量级的框架,对 SQLite API 进行了友好的封装,使用起来相当的灵活。同时也非常符合从 Web 开发转移动端开发的人员对数据库的使用,相信你会喜欢它的。

最近在做模板下载,需要把原来项目中的模板图片和配置文件 PList 保存到 SQLite 数据库便于与线上新模板合并。在知道用户本地的模板数据不会对 SQLite 造成压力,于是也把下载好的模板图片和配置参数一同写入到 SQLite。那样我就不用写文件管理只需要简单的一条删除 SQL 就完成了,简单粗爆。

1、数据类型

构想是把 NSDictionaryUIImage 转成 NSData 数据,找到了 SQLite 相对应的类型为 BLOB,写入进去读出来再转成相应的对象就大功告成了。

写入
downloadData[@"imageData"] = UIImagePNGRepresentation(image);

downloadData[@"paramData"] = [NSKeyedArchiver archivedDataWithRootObject:downloadData[@"param"]];

取出:

NSDictionary paramData = [NSKeyedUnarchiver unarchiveObjectWithData:tData[@"paramData"]];

UIImage templateImage = [UIImage imageWithData:tData[@"imageData"]];

NSLog 出来的语句是这样的

INSERT INTO template (imageData, ,paramData) VALUES (<89504e47....>,<62706c69 ....>)

发现读出来的数据是有的,转换成了对象后就失败了。首先是检查 SQLite 中的数据发现存的被存储成下面的格式了,这不是我想要的格式肯定是哪里错了。

<89504e47 0d0a1a0a 0000000d 49484452 00000438 0000076c 08060000 004ae73c f3000000 01735247 4200aece

问题出现在入库的 SQL 上,通常为了避免各种的错误,我都会将对象转成字符后再插入数据库,这样的做法在大多数情况下是正常的。
NSString keyString = [[fieldData allKeys] componentsJoinedByString:@","];

NSString valueString = [[fieldData allValues] componentsJoinedByString:@","];

NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@ (%@) VALUES ('%@')",tableName, keyString, valueString];

知道了问题所在剩下的事情就是 Google 一下和查看 FMDB 的文档说明,把问题解决掉。

2、正确的插入 Data 数据

FMDB官方说明

下面可以看到官方已经提供了插入对象的方法,我们只要按照方法进行转换就行。

NSInteger identifier = 42;

NSString name = @"Liam O'Flaherty ("the famous Irish author")";

NSDate date = [NSDate date];

NSString *comment = nil;

BOOL success = [db executeUpdate:@"INSERT INTO authors (identifier, name, date, comment) VALUES (?, ?, ?, ?)", @(identifier), name, date, comment ?: [NSNull null]];

if (!success) {

NSLog(@"error = %@", [db lastErrorMessage]);

}

阅读原文 »

1 收藏


直接登录

推荐关注