iOS简单runtime封装fmdb的使用

学习了iOS有一段时间了,使用到fmdb操作数据库的时候感觉有很多重复性的工作要做,查询数据库时面向对象性感觉很差,一个查询只能针对一个Model,经过了解发现了runtime的使用可以解决这一问题。

使用fmdb的时候相信有过这样的经历查询某个model时:

NSString *sql = @"select * from myFmdb";
    FMResultSet *set = [self.database executeQuery:sql];
    while (set.next) {
        int pid = [set intForColumn:@"id"];
        <span style="color:#ff0000;">NSString *name = [set stringForColumnIndex:1];
        NSInteger age = [set intForColumn:@"age"];</span>

        NSLog(@"id==%d,name==%@,age==%ld",pid,name,age);
    }

其中红色的代码是查询的某一个字段,我们不仅要知道字段的类型还要知道字段的位置,用起来就很不方便,而如果model类发生了改变那查询语句也随之改变才行。简单使用runtime可解决此类问题。

使用runtime代码如下(写成了一个方法):

- (NSMutableArray *)finAllWithSql:(NSString *)tableName
                             fmdb:(FMDatabase *)db
                            model:(Class)cls{
    //创建要返回的数组
    NSMutableArray *data = [NSMutableArray array];
    //根据表明查询数据库
    NSString *sql = [NSString stringWithFormat:@"select * from %@",tableName];
    //根据第三方的FMdatabase查询结果集
    FMResultSet *set = [db executeQuery:sql];

    //获取该model类的所有的属性列表
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList(cls, &count);

    //遍历
    while ([set next]) {
        //根据传进来的类cls,创建对应的对象并保存.
        id obj = [[cls alloc] init];

        //遍历所有的属性变量
        for (int i=0; i<count; i++) {
            //得到该属性
            Ivar ivar = ivars[i];
            const char *type = ivar_getTypeEncoding(ivar);

            //的到属性的类型用于判断
            NSString *valueType = [NSString stringWithCString:type encoding:NSUTF8StringEncoding];
            //得到属性的name使用setKey来设置值,要把属性那么前面的"_"去掉.
            NSString *proName = [NSString stringWithCString:ivar_getName(ivar) encoding:NSUTF8StringEncoding];
            NSString *name = [proName componentsSeparatedByString:@"_"][1];

            //判断属性类型,这里仅考虑了NSString,int和float类型(这里吧float转化为了double)
            if ([valueType hasPrefix:@"@"]) {
                //这是NSString类型的,设置值
                [obj setValue:[set stringForColumnIndex:i] forKey:name];

            }else if([valueType hasPrefix:@"q"]|[valueType hasPrefix:@"i"]){
                //"q"代表的是NSInteger类型,这是NSInteger类型的,设置值
                [obj setValue:@([set intForColumnIndex:i]) forKey:name];

            }else if ([valueType hasPrefix:@"f"]){
                //这是float类型的,设置值
                [obj setValue:@([set doubleForColumnIndex:i]) forKey:name];

            }
        }
        //将该字典存储到数组中.
        [data addObject:obj];
    }
    return data;
}

现对以上代码进行说明,首先传进来的参数有查询的表名,要查询的数据库以及查询的model类,使用fmdb查询后得到查询结果集,通过

unsigned int count = 0;
Ivar *ivars = class_copyIvarList(cls, &count);

得到model类的属性列表,然后遍历结果集,然后遍历属性列表的属性,

const char *type = ivar_getTypeEncoding(ivar);

得到的是属性的类型,之后的几条语句是将这个类型进行处理以用于判断,if语句是用于判断属性类型的,这里仅仅只是展示了三种类型,把属性值通过setValue forKey的方式复制给通过传进来的参数cls创建的类,然后保存到数组中。最后返回数组。

可以看出要想查询结果只要传进来几个参数就行了,最后返回的数组保存的是id类型的,用的时候强转一下就好了。

第一次写博客,希望方便大家学习,也方便自己学习进步,望大家指教。runtime的使用还是菜鸟,很多地方也有待改正望大神斧正。其实也可以封装sqlite的,只是写的时候就写成了这个样子。

时间: 2024-11-06 07:24:10

iOS简单runtime封装fmdb的使用的相关文章

iOS开发数据库篇—FMDB简单介绍

iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱 3.FMDB的github地址 https://github.com/ccgus/fmdb 二.核心类 FMDB有三个主要的类 (1)FMDa

[iOS]数据库第三方框架FMDB详细讲解

[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等. FMDB是一款简洁.易用的封装库.因此,在这里推荐使用第三方框架FMDB,它是对libsqlite3框架的封装,用起来的步骤与SQLite使用类似,并且它对于多线程的并发操作进行了处理,所以

iOS数据库操作(使用FMDB)

iOS学习笔记(十六)——数据库操作(使用FMDB) 分类: iOS开发 2013-07-15 23:19 8655人阅读 评论(5) 收藏 举报 目录(?)[+] iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一

iOS 数据库操作(使用FMDB)

iOS 数据库操作(使用FMDB) iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包.

iOS数据库操作之FMDB框架的使用

原文链接:http://blog.csdn.net/xyz_lmn/article/details/9312837 iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文

IOS 数据存储之 FMDB 详解

FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语言API,使用起来更加的方便,不需要过多的关心数据库操作的知识.但是它本身也存在一些问题,比如跨平台,因为它是用oc的语言封装的,所以只能在ios开发的时候使用,如果想实现跨平台的操作,来降低开发的成本和维护的成本,就需要使用比较原始的SQLite. Core Data是ORM的一种体现,使用Core Data需要用到模型数据的转化,虽

IOS开发之数据库FMDB

IOS开发之数据库FMDB 1.简介 需求作用:如果需要保存大量的结构较为复杂的数据时候, 使用数据库, 例如交规考试项目 常用的数据库: (1)Microsoft SQL Server 2000/2008:中小企业使用较多 (2)Oracle:比较复杂, 大企业使用较多 (3)Mysql数据库:网站使用较多 (4)sqlite:本地数据库, 访问数据足够快, 直接访问文件  足够简单, 功能相对其他数据库软件不是特别齐全, 足够用了  足够小, 系统不超过1M, 适合在移动端上使用 2. Me

iOS的runtime运行时机制

本文转自http://www.cnblogs.com/guoxiao/p/3583432.html 最近一直在研究runtime运行时机制的问题,我想可能也有很多人不太清楚这个问题吧?在这里跟大家沟通分享下我对与runtime机制的理解. 要理解runtime,首先我们要了解类和对象的内部结构,下面将首先介绍下OC中类与对象的结构层次. 一.首先,从 runtime.h头文件中找到对 class 与 object 的定义 /// An opaque type that represents an

【iOS开发】封装聊天输入框MKInputBar,语音支持iOS &amp; Android平台

最近做的一个项目,有聊天的功能,最开始从网上找了个被人封装好的输入框,写的很复杂(反正我有点被看迷糊了),用起来呢又有点问题,最终放弃,自己封装了一个聊天输入框MKInputBar,难度不大.语音支持iOS和Android平台,其实就是把caf转换为mp3.底部给出了Demo工程,用起来很简单. 先上几张图吧       用法很简答,封装好只有两个文件MKInputBar.h & MKInputBar.m,实现三个代理方法: 1 - (void)inputBar:(MKInputBar *)in