一个大大简化对单个数据模型进行缓存管理的工具

555 阅读1分钟
原文链接: github.com

结合objc的runtime,对FMDB的进一步封装,可方便快捷的对单个模型进行CRUD操作。如:

@interface Rectangle : NSObject

@property (nonatomic, assign) NSInteger width;
@property (nonatomic, assign) NSInteger length;
@property (nonatomic, copy) NSString *name;

@end

@implementation Rectangle

@end

获取SXJDatabaseManager对象:

SXJDatabaseManager *manager = [SXJDatabaseManager sharedManager];

创建Rectange对应的表:

[manager createTable:[Rectangle class]];

创建Rectange对应的表,并指定主键:

[manager createTableWithClass:[Rectangle class] primaryKeyNameArray:@[@"name"]];

向表中插入数据:

Rectangle *rect = [Rectangle new];
rect.name = @"rectangle1";
rect.width = 10;
rect.length = 25;
[manager insertModel:rect];

删除数据:

NSDictionary *cond = @{@"name": @"rectangle1"};
[manager deleteRecordFromTable:[Rectangle class] condition:cond];

更多用法,请直接参考SXJDatabaseManager.h中的api。

实现思路

没什么特别难的,获取一个对象的属性,然后得到每一个属性的类型编码,进行字符串的拼接。

实现时候,在从数据库中读到数据后,通过runtime知道了每个属性的类型,但是在运行期间怎么动态定义一个相应类型的变量很困扰。后来发现,FMResultSet有个resultDictionary属性,这样我就直接kvc搞定了。

resultDictionary的实现,直接定义一个id类型,如果是对象就直接放到字典里,如果是原生数据类型,就用NSNumber包装后放到字典里。 :flushed: :flushed:

存在的问题

由于目前只考虑单表操作,且不考虑把某种类型的属性序列化后存储,所以不支持属性中为集合类型,如NSDictionaryNSArrayNSSet。后续,如果要支持的话,优先考虑多表方案。

如果你认为这个实现还不错,或者帮助到了你,欢迎Star