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