Objective‑C版本的 Realm 能够让您以一种安全、耐用以及迅捷的方式来高效地编写应用的数据模型层!
最近在项目中用到了Realm框架进行数据存储,在这里和大家分享一下在运用中遇到的问题!
RLMObject 解析
相信很多朋友会遇到,用MJExtension等解析框架解析不了继承于RLMObject的对象,其实这主要是继承于RLMObject的对象 获取的类名方法不一样了;
平时我们也许是这样获取一个对象的类名的:
[object class];
但是如果继承于RLMObject的对象也用这个方法获取类的话,就不行了,例如:
#import <Realm/Realm.h>
#import "HDDog.h"
@interface HDUser : RLMObject
@property NSString *userid;
@property NSString *user_name;
@property RLMArray <HDDog*><HDDog>*dogs;
@end
HDUser *user = [[HDUser alloc]init];
user.userid = @"2";
user.user_name = @"解析";
NSLog(@"%@",[user class]);
打印结果为:
5B5225AC-FD19-4C20-9471-03495695BEEA.png那么我们要用什么方法去获取类名呢?
其实RLMObject提供了一个方法给我们去获取这个对象的类名;
50DEB754-43B3-4679-B672-76370F2A008D.png
因此我们可以这样获取:
NSLog(@"%@",[[user class] className]);
打印结果为:
7E46792F-F44A-4D43-8A2E-739A27943D4B.png
最后我们可以通过runtime解析
#import "RLMObject+HDJson.h"
#import <objc/runtime.h>
@implementation RLMObject (HDJson)
#pragma mark -模型转字典
-(NSMutableDictionary*)hd_keyValues{
NSMutableDictionary *propertyDic = [NSMutableDictionary dictionaryWithCapacity:0];
unsigned int outCount;
//获取对象的属性列表
objc_property_t *properties = class_copyPropertyList(NSClassFromString([[self class] className]), &outCount);
for (int i = 0; i < outCount; i++) {
NSString *name = [NSString stringWithCString:property_getName(properties[i]) encoding:NSUTF8StringEncoding];
id value = [self valueForKey:name];
if (value) {
if ([value isKindOfClass:[RLMArray class]]) {//判断是否是数组
//模型数组转字典数组成
[propertyDic setObject:[self hd_keyValuesArrayWithObjectArray:value] forKey:name];
}else{
[propertyDic setObject:value forKey:name];
}
}
}
free(properties);
return propertyDic;
}
#pragma mark - 模型数组 -> 字典数组
-(NSMutableArray*)hd_keyValuesArrayWithObjectArray:(NSArray *)objectArray{
NSMutableArray *array = [[NSMutableArray alloc]init];
for (RLMObject *obje in objectArray) {
[array addObject:obje.hd_keyValues];
}
return array;
}
如果有需要可以下载demo: https://github.com/LiuHengye/RealmJson
网友评论