
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的语言。
这里讲反射, 主要是给大家讲一下这一种思路。