1. 首先我们要知道,这使用的是运行时的反射机制
所以我们需要头文件 runtime.h
1- (BOOL) createTableByClassAttributes: (id)classModel {23//得到类名 当表名、 也为了下边的反射、4NSString *className = NSStringFromClass([classModelclass]);56//初始化一个装sql的可变string7NSMutableString * sqlQuery = [NSMutableString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (", className];89constchar* cClassName =[className UTF8String];1011idclassM =objc_getClass(cClassName);12//i 计数 、 outCount 放我们的属性个数13unsignedintoutCount, i;14//反射得到属性的个数 、15objc_PRoperty_t * properties = class_copyPropertyList(classM, &outCount);1617//循环 得到属性名称 拼接数据库语句18for(i =0; i < outCount; i++) {19objc_property_t property =properties[i];20//获得属性名称21NSString * attributeName =[NSString stringWithUTF8String:property_getName(property)];2223if(i == outCount -1) {24[sqlQuery appendFormat:@"%@ TEXT)", attributeName];25
break;26}27//开始做拼接28[sqlQuery appendFormat:@"%@ TEXT,", attributeName];29}3031if([self openDatabase] ==YES) {3233char*error;34intresult = sqlite3_exec(_db, [sqlQuery UTF8String], NULL, NULL, &error);35if(result ==SQLITE_OK) {36returnYES;37}else{38NSLog(@"%@", [self errorWithMessage:[NSString stringWithFormat:@"%s", error]]);39returnNO;40}41}else{42NSLog(@"%@", [self errorWithMessage:@"openDB Failure"]);43returnNO;44}45}
// 当然 这是在数据库中写的, 你可能需要导入libsqlite这个库并创建数据库才能看见他的真正效果
ps: 运行时,我们可以得到某个类的全部属性,包括属性名称,值, 类型, 同事也可以得到方法的名称。
这里用的是纯c的语言。
这里讲反射, 主要是给大家讲一下这一种思路。