结合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包装后放到字典里。
存在的问题
由于目前只考虑单表操作,且不考虑把某种类型的属性序列化后存储,所以不支持属性中为集合类型,如NSDictionary,NSArray,NSSet。后续,如果要支持的话,优先考虑多表方案。
如果你认为这个实现还不错,或者帮助到了你,欢迎Star