如何写一个FMDB帮助类?看看runtime吧
FMDB是一个封装很好的sqllite类库。项目中调用的时候只需要写SQL语句,就能实现数据的CURD。我试过即使手写SQL语句也很麻烦,需要一个字段一个字段的拼上去,而且容易出错。有没有动态获取字段的一种做法呢。当然是有的。在.NET中就有获取一个类的每个字段名称和类型之类的方法。同理,我想OC中肯定也会存在,于是乎,强大的runtime机制就可以拿来用用了。
为什么用动态的呢,因为动态的拼接表面上就和ORM差不多了,开发者基本不用接触SQL语句,就能实现与数据库的数据交互。下面看具体介绍:
Class c = [SomeModel Class]; unsigned int outCount,i;
//class_copyPropertyList方法获取 SomeModel中的字段集合
objc_property_t *properties = class_copyPropertyList(c, &outCount);
然后遍历properties,获取到每个字段的字段名称和字段类型
objc_property_t property = properties[i];
propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; propertyType = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];
这样,类中的每个字段都有了,类型也有了,那么拼接update语句或者insert语句再或者查询都可以。例如: UPDATE TABLE SET A='a',B='b',C=1 WHERE 1=1
字段A,B,C已经能动态取出,a,b,1可以根据新的Model 用 [model objectForKey:]方法获取值。先简单说这么多,下面我通过一个小Demo来演示一下。
首先实现方法,分析类的字段属性和类型,并存放到一个NSdictionary中。
- (NSDictionary *)pz_getClassPropertyWithClass:(Class)c
{
//存储列名和列类型的可变数组
NSMutableArray *propertyNames = [NSMutableArray array];
NSMutableArray *propertyTypes = [NSMutableArray array]; unsigned int outCount,i; objc_property_t *properties = class_copyPropertyList(c, &outCount); //属性名称
NSString *propertyName;
NSString *propertyType;
for (i = ; i < outCount; i ++) {
objc_property_t property = properties[i];
propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
//将不需要的排除
if ([_cloumnsNotInDB containsObject:propertyName]) {
continue;
}
[propertyNames addObject:propertyName];
//获取属性类型
propertyType = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding]; if ([propertyType hasPrefix:@"T@"]) {
[propertyTypes addObject:SQLTEXT];
}else if ([propertyType hasPrefix:@"Ti"]||[propertyType hasPrefix:@"TI"]||[propertyType hasPrefix:@"Ts"]||[propertyType hasPrefix:@"TS"]||[propertyType hasPrefix:@"TB"]) {
[propertyTypes addObject:SQLINTEGER];
} else {
[propertyTypes addObject:SQLREAL];
}
}
free(properties); return [NSDictionary dictionaryWithObjectsAndKeys:propertyNames,propertyNameKey,propertyTypes,propertyTypeKey, nil];
}
然后随便写个Model,调用方法如下:
NSDictionary *dict = [[PZFMDBUtil sharedUtil] pz_getClassPropertyWithClass:[PZDBModel class]]; NSLog(@"%@",dict);
打印结果为:
字段名称和类型都有啦,那么拼接 insert into table (name,age,number,address) values (?,?,?,?) 是不是很easy了呢。然后在调用一下FMDB的方法,就轻松实现Model直接保存或者更新到SQLLITE中了。
例如以下代码:
PZDBModel *model = [[PZDBModel alloc] init];
model.name = @"panzi";
model.number = ;
[[PZFMDBUtil sharedUtil] pz_addDataWithModel:model];
我们在看一下数据库:
我想,更新查询神马的就不用介绍了吧。当然呢,想在封装一层也是很麻烦的,要考虑好多东西。有时候想想还不如直接写SQL来的爽快~~
GitHub:https://github.com/fanpan26/PZFMDBHelper
如何写一个FMDB帮助类?看看runtime吧的更多相关文章
- JavaScript写一个表格排序类
依稀记得那是上个星期六的下午,我参加了网易暑期实习生招聘笔试.考得相当糟糕,编程题3个题通过了2个,简答题没做对,选择题貌似是20个题猜了6-7个,99%是挂了,唉唉唉!生活不只眼前的苟且,学习的脚步 ...
- 手写一个LRU工具类
LRU概述 LRU算法,即最近最少使用算法.其使用场景非常广泛,像我们日常用的手机的后台应用展示,软件的复制粘贴板等. 本文将基于算法思想手写一个具有LRU算法功能的Java工具类. 结构设计 在插入 ...
- 使用Java的多线程和IO流写一个文件复制功能类
创建一个复制功能类,继承Thread类,重写run()方法,把FileInputStream和FileOutputStream输入输出流写在run()方法内.示例代码如下: import java.i ...
- .net 在数据访问层中写一个DBhelper优化类
复习了在学校的时候做的WinForm端的一个学生信息管理系统,用的三层架构,看了一下里面的数据优化类 这个类是用来把对数据库的操作封装成静态方法,增删改查的时候直接调用这个类,减少项目里代码的冗余和方 ...
- 最近工作用到压缩,写一个zip压缩工具类
package test; import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream ...
- python win32com 处理excle 写一个公共的类
利用win32com处理excle,这样可以不管文件是老的xls还是新的xlsx格式,非常方便. 类的源码如下: import win32com.client as win32 class easyE ...
- 用 Java 写一个单例类?
饿汉式单例 public class Singleton { private Singleton(){} private static Singleton instance = new Singlet ...
- Java-编写一个jdbc操作类
1.通过读取文件配置 package 数据库操作类; /* * Db.java Created on 2007年8月20日, 上午 8:37 */ import java.io.*; import j ...
- 写一个Foreach帮助类,在razor中使用
原文发布时间为:2011-05-05 -- 来源于本人的百度文章 [由搬家工具导入] A Better Razor Foreach Loop(razor delegate extension) htt ...
随机推荐
- APP在实际开发中应注意的关键点
在APP开发过程中,开发者比较注重的是功能模块的实现,从而忽略了APP的设计问题,特别是企业开发APP,但是,APP设计是APP开发中非常重要的一个环节,APP界面设计直接影响到APP用户的感官,因此 ...
- vue嵌套路由 && 404重定向
第一部分: vue嵌套路由 嵌套路由是什么? 嵌套路由就是在一个被路由过来的页面下可以继续使用路由,嵌套也就是路由中的路由的意思. 比如在vue中,我们如果不使用嵌套路由,那么只有一个<rou ...
- 虚拟机vmware 上不去 连不上网问题解决
开始---设置--控制面板---管理工具---服务 确保 VMware DHCP Service 和VMware NAT Service 服务已经启动
- 如何优雅地进行错误处理(clean code阅读笔记之六)
错误处理是十分必要的,但是如果对错误处理使用不当则会让代码变得十分臃肿,让阅读者看不清代码的逻辑,更严重的是,这也会让程序变得十分脆弱.本文中将列出一些使用错误处理的技巧,帮助你写出既简洁又健壮的代码 ...
- [转]ASP.NET Core基本原理(11)-管理应用程序状态
本文转自:http://zhuchenglin.me/fundamentals-11-app-state?utm_source=tuicool&utm_medium=referral ASP. ...
- 从零开始写C# MVC框架之--- 项目结构
框架总分2个项目:Web开发项目.帮助类项目 (ZyCommon.Zy.Utilities) 1.ZyCommon,是Web开发项目结构.新建一个空解决方案,再建Data.Service.ZyWeb解 ...
- Nginx的各种报错总结
1.Nginx安装过程报错 错误一:软件依赖包未正确安装问题---PCRE依赖包没有安装 ./configure: error: the HTTP rewrite module requires th ...
- Distinct 去掉重复 order by
语法: select distinct user from book select * from sdudant order by sex asc,sNo 从表sdudant查找已性别升序排序,性别相 ...
- IO流之递归
递归: 递归,指在当前方法内调用自己的这种现象 public void method(){ System.out.println(“递归的演示”); //在当前方法内调用自己 method(); } ...
- Objective C 中的nil,Nil,NULL和NSNull理解
kenyo网友的原创说法是:做IOS开发的估计都对Objective-C的内存管理机制很头疼,一不小心程序就会出内存泄露,我也不例外,前几天被指针的置nil与release给搞惨了,今和大家详细解说一 ...