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的语言。
这里讲反射, 主要是给大家讲一下这一种思路。
新闻热点
疑难解答