本地数据库文件转 model

发现公司的项目中的数据不是从网络获取,而是一个创建好的.db文件,其中有很多表,就写了个转 model 的方法

创建单例,以便整个项目任何地方使用

  • 代码
    // .h 文件中的代码
    
    #import "DataBase.h"
    
    static DataBase *_DBCtl = nil;

    @interface DataBase(){
    
        FMDatabase  *_db;
    }
    
    @end
    
    
    
    @implementation DataBase

        #pragma mark - 初始化数据库
        
        //创建数据库,并将数据库转成 model 存在数组中方便全局使用
        
        - (void)creatDataBase {
        
            NSString *filePath = [[NSBundle mainBundle] pathForResource:@"DLDT" ofType:@"db"];
        
            if(!_db){
                _db = [FMDatabase databaseWithPath:filePath];
            }      
        }
        
        
        /**
        将数据库转成model
        @param table 数据库中表的名字
        @param myClass model , 存储属性名对应数据库中的字段名
        @return 装有model的数组
        */
    
        - (NSMutableArray *)getTable:(NSString *)table fromClass:(NSObject *)myClass {
    
            if (![_db open]) {  return nil; }
            
            //数据库数组
            NSMutableArray *arrSQL = [[NSMutableArray alloc] init];
            
            // 查询数据库
            NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@",table];
            
            FMResultSet *res = [_db executeQuery:sql];
            
            // 定义一个变量记录对应 model 的属性数量和属性名集合
            unsigned int outCount;
            
            while ([res next]) {
            
                // 获取传入类的属性名
                objc_property_t *propertys = class_copyPropertyList([myClass class], &outCount);
                
                // 创建一个字典,用来存储数据库的 K-V
                NSMutableDictionary *dicProperty = [NSMutableDictionary dictionary];
                
                for (int i = 0; i < outCount; i ++) {
                
                    //获取属性名
                    objc_property_t property = propertys[i];  
                    
                    // 将属性名作为字典 key
                    NSString *strKey = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
                    
                    // 用 key 去是数据库中获取值
                    NSString *strValue = [res stringForColumn:strKey];
                    
                    // 去空
                    strValue = strValue == nil ? @"" : strValue;
                    
                    [dicProperty setObject:strValue forKey:strKey];    //存值
                }
                
                // 释放属性
                free(propertys);
                
                // 转 model
                myClass = [[myClass class] mj_objectWithKeyValues:dicProperty];
                
                // 放入数组
                [arrSQL addObject:myClass];
            }
            
            [_db close]; // 关闭数据库
            
            return arrSQL;  // 返回装有 model 的数组
        }
    
    @end
    

使用

  • 代码
    //这是 .m 文件中的实现,用tableView 展示数据库美容

    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
        
        self.title = @"数据库转model";
        _arrInfo = [[DataBase shareData] getTable:@"station" fromClass:[DataModel copy]];
    }
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        NSString *cellID = @"station";
        
        DataModelCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
        
        if (!cell) {
        
            cell = [[DataModelCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
        }
        _model = _arrInfo[indexPath.row];
            
        cell.label.text = _model.StationName;
        
        return cell;
    
    }
    
    
    //下面是 swift 版 
    
    // 只要将 db 文件的引入,传入相应表名和  model 类,就可以得到相应model 了,
    
    //将数据库转成 model
    
    private func getTable(table : String , from className : NSObject.Type) -> (NSMutableArray) {
        
        if db?.open() == false { return [] }
             
        let MyClass : NSObject.Type? = className
    
        let arrSQL = NSMutableArray()
        let path = "SELECT * FROM \(table)"
        let result = db?.executeQuery(path, withArgumentsIn: nil)
        var outCount : UInt32 = 0
    
        while (result?.next())! {
    
            let properties  = class_copyPropertyList(MyClass, &outCount)
    
            let dic = NSMutableDictionary()  
             
            for index in 0 ..< numericCast(outCount) {
    
                let property : objc_property_t = properties![index]!
    
                let key : String = NSString.init(utf8String: property_getName(property)) as! String
    
                let value = result?.string(forColumn: key)
    
                //存字典
                dic.setObject(value ?? "", forKey: key as NSCopying)
            }
        
        
            free(properties)
        
            var myClass = MyClass?.init()
            myClass =  MyClass!.mj_object(withKeyValues: dic)
            arrSQL.add(myClass!)
        }
    
        return arrSQL
    }

效果
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353