您的位置:首页 > 移动开发 > Objective-C

IOS ORM简单实现方案:NSObject及其子类与字典的转换

2014-09-29 20:34 369 查看
Objective-c中本身没有提供ORM实现的具体方案,但实际开发中有些场景应用到ORM,比如:服务端关系型数据库数据存储、sqlite存储、plist等,这些场景中往往以key-value方式读写数据,而objective-c本身却是实体对象存储更为方便,怎样才能让实体对象和字典自由转换以满足这些场景呢,下面提供一种实现方案:

id createInstance(Class cls,NSDictionary *dic) {
return [[cls alloc] initWithMappingDic:dic];
}


NSArray *mappingDicArrayFromObjectArray(NSArray *objectArray){

NSMutableArray *mappingDicArray = [NSMutableArray array];

for (int i = 0; i < objectArray.count; i++) {
id obj = [objectArray objectAtIndex:i];

if ([obj isKindOfClass:[NSString class]] ||
[obj isKindOfClass:[NSNumber class]] ||
[obj isKindOfClass:[NSDictionary class]] ||
[obj isKindOfClass:[NSMutableString class]] ||
[obj isKindOfClass:[NSMutableDictionary class]]) {

[mappingDicArray addObject:obj];
}else {
[mappingDicArray addObject:[obj mappingDic]];
}
}
return mappingDicArray;
}


NSArray *objectArrayFromMappingDicArray(NSArray *mappingDicArray,Class cls){

NSMutableArray *objectArray = [[NSMutableArray alloc] init];

for (int i = 0; i < mappingDicArray.count; i++) {
id obj = [mappingDicArray objectAtIndex:i];

if ([obj isKindOfClass:[NSString class]] ||
[obj isKindOfClass:[NSNumber class]] ||
[obj isKindOfClass:[NSDictionary class]] ||
[obj isKindOfClass:[NSMutableString class]] ||
[obj isKindOfClass:[NSMutableDictionary class]]) {

//什么也不做
}else {
if (cls) {

obj = createInstance(cls, obj);
}
}
[objectArray addObject:obj];
}
return objectArray;
}


以上三方法为基础方法,以下则为NSObject添加扩展方法:

- (id)initWithMappingDic:(NSDictionary*)dic {

self = [self init];
if (self) {

u_int ivarCount;
Ivar *ivars = class_copyIvarList([self class], &ivarCount);

for (int i = 0; i < ivarCount; i++) {
const char *ivarCName = ivar_getName(ivars[i]);
const char *ivarCType = ivar_getTypeEncoding(ivars[i]);

NSString *ivarName = [NSString stringWithCString:ivarCName encoding:NSUTF8StringEncoding];

NSString *ivarDecodeType = [NSString decodeType:ivarCType];

NSString *ivarType = [[NSString alloc] initWithCString:ivarCType encoding:NSUTF8StringEncoding];

id value = [dic valueForKey:ivarName];
if (!value) {
continue;
}
if ([value isKindOfClass:[NSString class]]||[value isKindOfClass:[NSMutableString class]]||[value isKindOfClass:[NSNumber class]]) {
if (!value) {
if ([ivarDecodeType isEqualToString:@"int"]||[ivarDecodeType isEqualToString:@"unsigned int"]||[ivarDecodeType isEqualToString:@"float"]||[ivarDecodeType isEqualToString:@"double"]||[ivarDecodeType isEqualToString:@"long"]||[ivarDecodeType isEqualToString:@"BOOL"])
{
value = [NSNumber numberWithInt:0];
}

}

}else if ([value isKindOfClass:[NSMutableDictionary class]]||[value isKindOfClass:[NSDictionary class]]){
value = (NSDictionary *)value;

if (![ivarDecodeType isEqualToString:@"NSDictionary"]&&![ivarDecodeType isEqualToString:@"NSMutableDictionary"]) {

value = createInstance(NSClassFromString(ivarDecodeType), value);
[self setValue:value forKey:ivarName];

value = nil;
continue;
}

}else if ([value isKindOfClass:[NSArray class]]||[value isKindOfClass:[NSMutableArray class]]) {

value = objectArrayFromMappingDicArray((NSArray*)value, NSClassFromString(ivarName));

}else if ([value isKindOfClass:[NSNull class]]) {
value = nil;
}else {
value = nil;
MPLog(@"JSON unknown type : %@", NSStringFromClass([value class]));

}

[self setValue:value forKey:ivarName];
ivarName = nil;
ivarType = nil;
}
free(ivars);
}

return self;
}


- (NSDictionary *)mappingDic {

u_int ivarCount;

NSMutableDictionary *mappingDic = [NSMutableDictionary dictionary];

Ivar *ivars = class_copyIvarList([self class], &ivarCount);

for (int i = 0; i < ivarCount; i++) {
const char *ivarCName = ivar_getName(ivars[i]);
const char *ivarCType = ivar_getTypeEncoding(ivars[i]);

NSString *ivarName = [NSString stringWithCString:ivarCName encoding:NSUTF8StringEncoding];
NSString *ivarDecodeType = [NSString decodeType:ivarCType];

MPLog(@"ivarCType:%s  ivarDecodeType:%@  ivarCName:%s  ",ivarCType,ivarDecodeType,ivarCName);

id value = nil;
if ([ivarDecodeType isEqualToString:@"NSString"]||[ivarDecodeType isEqualToString:@"NSMutableString"]||[ivarDecodeType isEqualToString:@"NSDictionary"]||[ivarDecodeType isEqualToString:@"NSMutableDictionary"]||[ivarDecodeType isEqualToString:@"NSNumber"]) {

value = [self valueForKey:ivarName];

}else if ([ivarDecodeType isEqualToString:@"int"]||[ivarDecodeType isEqualToString:@"unsigned int"]||[ivarDecodeType isEqualToString:@"float"]||[ivarDecodeType isEqualToString:@"double"]||[ivarDecodeType isEqualToString:@"long"]||[ivarDecodeType isEqualToString:@"BOOL"]){

value = [self valueForKey:ivarName];

}else if ([ivarDecodeType isEqualToString:@"NSArray"]||[ivarDecodeType isEqualToString:@"NSMutableArray"]) {
value = mappingDicArrayFromObjectArray([self valueForKey:ivarName]);

}else {
value = [[self valueForKey:ivarName] mappingDic];
}

[mappingDic setValue:value forKey:ivarName];
}

free(ivars);
return mappingDic;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: