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 計數(shù) 、 outCount 放我們的屬性個數(shù)13 unsigned int outCount, i;14 // 反射得到屬性的個數(shù) 、15 objc_PRoperty_t * properties = class_copyPropertyList(classM, &outCount);16 17 // 循環(huán) 得到屬性名稱 拼接數(shù)據(jù)庫語句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 }
// 當然 這是在數(shù)據(jù)庫中寫的, 你可能需要導(dǎo)入libsqlite這個庫并創(chuàng)建數(shù)據(jù)庫才能看見他的真正效果
ps: 運行時,我們可以得到某個類的全部屬性,包括屬性名稱,值, 類型, 同事也可以得到方法的名稱。
這里用的是純c的語言。
這里講反射, 主要是給大家講一下這一種思路。
新聞熱點
疑難解答