IOS ORM简单实现方案:NSObject及其子类与字典的转换
2014-09-29 20:34
369 查看
Objective-c中本身没有提供ORM实现的具体方案,但实际开发中有些场景应用到ORM,比如:服务端关系型数据库数据存储、sqlite存储、plist等,这些场景中往往以key-value方式读写数据,而objective-c本身却是实体对象存储更为方便,怎样才能让实体对象和字典自由转换以满足这些场景呢,下面提供一种实现方案:
以上三方法为基础方法,以下则为NSObject添加扩展方法:
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; }
相关文章推荐
- iOS简单动画实现方案
- Excel与XML相互转换 - C# 简单实现方案
- 利用字典实现Python中简单的ORM映射
- Excel与XML相互转换 - C# 简单实现方案
- Excel(XLS,XLSX)和CSV相互转换 - C#简单实现方案
- iOS 字典和简单数据模型相互转换(通用版)
- 简单实用的HTML到UBB转换脚本工具实现说明
- [分享]微软BI专题-渐变维度转换及其实现
- 汉字转换成Unicode,简单的java实现方法
- ORM,ASP.NET中ORM学习,ASP.NET中ORM学习心得,WEB2.0中ORM实现原理,Asp.net简单ORM示例源码详细讲解,Asp.net2.0:如何使用ObjectDataSource(配合ORM )
- 在BASH下简单实现十进制到二进制和十六进制的转换
- 简单的SSO方案 COOKIE实现
- 简单的SSO方案 COOKIE实现
- 快速实现简单高效并可以灵活配置的URL重写方案(附源代码)
- 阿拉伯数字转换英文数字表示算法解析及其实现
- 简单点播数统计实现方案
- silverlight2实现播放器的简单原理及其mediaelement的属性介绍
- 简单实现网页简体中文转换到繁体中文
- 简单的stringstream实例--实现字符串与数字之间相互转换
- 在特定情况下的简单SSO实现方案