OC反射机制获得该类全部属性并创建数据表_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > OC反射机制获得该类全部属性并创建数据表

OC反射机制获得该类全部属性并创建数据表

 2014/10/3 21:15:55  Dylan.Alice  程序员俱乐部  我要评论(0)
  • 摘要:1.首先我们要知道,这使用的是运行时的反射机制所以我们需要头文件runtime.h1-(BOOL)createTableByClassAttributes:(id)classModel{23//得到类名当表名、也为了下边的反射、4NSString*className=NSStringFromClass([classModelclass])
  • 标签:创建 反射 数据 数据表 反射机制

1. 首先我们要知道,这使用的是运行时的反射机制

所以我们需要头文件 runtime.h

 1 - (BOOL) createTableByClassAttributes: (id)classModel {
 2     
 3     // 得到类名 当表名、  也为了下边的反射、
 4     NSString *className = NSStringFromClass([classModel class]);
 5     
 6     // 初始化一个装sql的可变string
 7     NSMutableString * sqlQuery = [NSMutableString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (", className];
 8     
 9     const char * cClassName = [className UTF8String];
10     
11     id classM = objc_getClass(cClassName);
12     // i 计数 、  outCount 放我们的属性个数
13     unsigned int outCount, i;
14     // 反射得到属性的个数 、
15     objc_property_t * properties = class_copyPropertyList(classM, &outCount);
16     
17     // 循环 得到属性名称  拼接数据库语句
18     for (i = 0; i < outCount; i++) {
19         objc_property_t property = properties[i];
20         // 获得属性名称
21         NSString * attributeName = [NSString stringWithUTF8String:property_getName(property)];
22         
23         if (i == outCount - 1) {
24             [sqlQuery appendFormat:@"%@ TEXT)", attributeName];
25             break;
26         }
27         // 开始做拼接
28         [sqlQuery appendFormat:@"%@ TEXT, ", attributeName];
29     }
30     
31     if ([self openDatabase] == YES) {
32         
33         char * error;
34         int result = sqlite3_exec(_db, [sqlQuery UTF8String], NULL, NULL, &error);
35         if (result == SQLITE_OK) {
36             return YES;
37         } else {
38             NSLog(@"%@", [self errorWithMessage:[NSString stringWithFormat:@"%s", error]]);
39             return NO;
40         }
41     } else {
42         NSLog(@"%@", [self errorWithMessage:@"openDB Failure"]);
43         return NO;
44     }
45 }

// 当然 这是在数据库中写的, 你可能需要导入libsqlite这个库并创建数据库才能看见他的真正效果

ps: 运行时,我们可以得到某个类的全部属性,包括属性名称,值, 类型, 同事也可以得到方法的名称。 

这里用的是纯c的语言。

这里讲反射, 主要是给大家讲一下这一种思路。

发表评论
用户名: 匿名