利用object-c反射功能封装FMDB
2012-04-23 23:22
155 查看
http://hi.baidu.com/%CA%FD%D1%A7rubish/blog/item/fabea81efe7dae7cf724e4ea.html
在利用fmdb操作sqllite的时候,感觉存在很多冗余代码,所以偶发其想,想到了java的反射,java的很多orm框架都利用了反射这一高级语言的功能,我只能说很好很强大
coredata没见过源码,我感觉或多或少应该也是应用的反射功能
google了一些资料,决定封装一个保存功能,此处暂提供一个思路,具体还需要修改优化
代码如下:
-(void)saveEntity:(Entity *)entity{
Class class = [entity class];
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList(class,&outCount);
NSString *sql = [NSString stringWithFormat:@" INSERT INTO %@ (",[entity tableName]];
NSString *sqlValue = @" VALUES (";
NSMutableArray *dic = [[NSMutableArray alloc] initWithCapacity:5];
for(int i = 0 ; i<outCount ; i++){
const char *pName = property_getName(properties[i]);
NSString *propertyName = [NSString stringWithCString:pName encoding:NSUTF8StringEncoding];
NSObject *value = [entity valueForKey:propertyName];
if(value != nil){
[dic addObject:value];
}
if(i == outCount - 1){
sql = [sql stringByAppendingString:propertyName];
sqlValue = [sqlValue stringByAppendingString:@"?"];
//sqlValue = [sqlValue stringByAppendingFormat:@"%@",value];
}else {
sql = [sql stringByAppendingString:propertyName];
sqlValue = [sqlValue stringByAppendingString:@"?"];
//sqlValue = [sqlValue stringByAppendingFormat:@"%@",value];
sql = [sql stringByAppendingString:@","];
sqlValue = [sqlValue stringByAppendingString:@","];
}
}
sql = [sql stringByAppendingString:@")"];
sqlValue = [sqlValue stringByAppendingString:@")"];
free(properties);
NSLog(@"%@",[NSString stringWithFormat:@"%@%@",sql,sqlValue]);
SqliteInterface *interface = [SqliteInterface sharedSqliteInterface];
FMDatabase *db = [interface connectDB];
[db beginTransaction];
[db executeUpdate:[NSString stringWithFormat:@"%@%@",sql,sqlValue]withArgumentsInArray:dic];
[db commit];
[interface closeDB];
}
在利用fmdb操作sqllite的时候,感觉存在很多冗余代码,所以偶发其想,想到了java的反射,java的很多orm框架都利用了反射这一高级语言的功能,我只能说很好很强大
coredata没见过源码,我感觉或多或少应该也是应用的反射功能
google了一些资料,决定封装一个保存功能,此处暂提供一个思路,具体还需要修改优化
代码如下:
-(void)saveEntity:(Entity *)entity{
Class class = [entity class];
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList(class,&outCount);
NSString *sql = [NSString stringWithFormat:@" INSERT INTO %@ (",[entity tableName]];
NSString *sqlValue = @" VALUES (";
NSMutableArray *dic = [[NSMutableArray alloc] initWithCapacity:5];
for(int i = 0 ; i<outCount ; i++){
const char *pName = property_getName(properties[i]);
NSString *propertyName = [NSString stringWithCString:pName encoding:NSUTF8StringEncoding];
NSObject *value = [entity valueForKey:propertyName];
if(value != nil){
[dic addObject:value];
}
if(i == outCount - 1){
sql = [sql stringByAppendingString:propertyName];
sqlValue = [sqlValue stringByAppendingString:@"?"];
//sqlValue = [sqlValue stringByAppendingFormat:@"%@",value];
}else {
sql = [sql stringByAppendingString:propertyName];
sqlValue = [sqlValue stringByAppendingString:@"?"];
//sqlValue = [sqlValue stringByAppendingFormat:@"%@",value];
sql = [sql stringByAppendingString:@","];
sqlValue = [sqlValue stringByAppendingString:@","];
}
}
sql = [sql stringByAppendingString:@")"];
sqlValue = [sqlValue stringByAppendingString:@")"];
free(properties);
NSLog(@"%@",[NSString stringWithFormat:@"%@%@",sql,sqlValue]);
SqliteInterface *interface = [SqliteInterface sharedSqliteInterface];
FMDatabase *db = [interface connectDB];
[db beginTransaction];
[db executeUpdate:[NSString stringWithFormat:@"%@%@",sql,sqlValue]withArgumentsInArray:dic];
[db commit];
[interface closeDB];
}
相关文章推荐
- 利用object-c反射功能封装FMDB
- Qt4中利用Meta Object实现类拟.NET和Java的反射(Reflection)功能
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象
- 利用java的反射原理实现数据注入功能
- object对象java 利用反射 从数据库取出数据对象list 类似hibernate
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- c#利用反射,实现将model类变成字符串、再还原成mode对象的功能
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象
- 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析
- 【转】第7篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:全自动注册与反射方法分析
- 利用FMDB封装工具类
- Eclipse代码提示功能是不是利用反射
- JSON利用superobject进行资料交换及重新封装ClientDataSet
- C#动态执行类库中的函数:利用反射实现(js)Eval,asp(Execute)功能
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- JDBC 利用反射技术将查询结果封装为对象(简单ORM实现)
- 如何利用内部类的类型封装功能实现线程安全的类以提高程序的性能
- 封装poi库,利用反射读取Excel(通用)
- 利用反射机制实现servlet的分派功能