美文网首页数据处理安全iOS开发程序员
基于FMDB封装-直接存Model,取Model

基于FMDB封装-直接存Model,取Model

作者: 喊我超哥啊 | 来源:发表于2016-11-08 11:53 被阅读906次

项目中经常遇到数据持久化的问题,直接使用FMDB比较麻烦,我想直接存Model数据源,然后直接建表,存储。

思路是这样的:
1. 建表,传入Model的Class,根据Model的Class拿到Model里面的所有成员变量,然后把成员变量拼接成SQL语句,然后执行,根据Model的成员变量自动建表。
2. 存,传入装有Model数据的数组Arr,或者直接Model数据,使用Runtime拿到这个Model的键值对,然后拼接成插入SQL语句。
3. 取。取比较多样化,可以去整个表数据,也可以根据条件去取。当取到数据之后,弄成字典键值对。然后根据这个ModelClass创建对象,然后使用键值对给这个Model赋值,存入数组,然后传出。

1.建表

/**
 *  创建表
 *
 *  @param tabName 表名
 *  @param model   数据model
 *
 *  @return
 */
+ (instancetype)instantiationSqlTabName:(NSString *)tabName WithModelClass:(Class)modelClass{
    
    NSString* sql=[NSString stringWithFormat:@"create table if not exists %@ (id integer primary key autoincrement ",tabName];
    
    for (NSString *str in [modelClass GetPropertyKey]) {
        
        NSString *strq = [NSString stringWithFormat:@",%@ ",str];
        
        sql = [sql stringByAppendingString:strq];
    }
    
    sql = [sql stringByAppendingString:@")"];
    
    NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    
    NSString *fileName=[doc stringByAppendingPathComponent:[NSString stringWithFormat:@"sql.sqlite"]];
    
    NSLog(@"%@",fileName);
    
    ZCSqlTool *sqltool = [ZCSqlTool new];
    
    sqltool.db = [[FMDatabase alloc]initWithPath:fileName];
    
    if ([sqltool.db open]) {
        
        [sqltool.db executeUpdate:sql];
        
    }else{
        
        NSLog(@"创建失败");
    }
    
    return sqltool;
}

2.存

/**
 *  插入数据
 *
 *  @param tabName  表名
 *  @param data     数据
 *  @param isDelete 是否清空该表之前的数据
 *
 *  @return
 */
- (BOOL)insertDataTabName:(NSString *)tabName WithData:(id)data WithdeleteFrom:(BOOL)isDelete{
    
    if (isDelete == YES) {
        
        NSString *sql = [NSString stringWithFormat:@"delete from %@",tabName];
        
        BOOL isDeleteResult = [self.db executeUpdate:sql];
        
        if (isDeleteResult) {
            
            return [self carriedOutInsertDataTabName:tabName WithDatas:data];
            
        }else{
            
            NSLog(@"删除失败");
            
            return NO;
        }
    }
    
    return [self carriedOutInsertDataTabName:tabName WithDatas:data];
}

3.取

- (BOOL)conditionalDeletionTabName:(NSString *)tableName condition:(NSString *)condition,...NS_REQUIRES_NIL_TERMINATION{
    
    
    va_list ap;
    
    va_start(ap, condition);
    
    NSString *str;
    
    NSString *str1 = [[condition componentsSeparatedByString:@"="] firstObject];
    
    NSString *str2 = [[condition componentsSeparatedByString:@"="] lastObject];
    
    NSString *sqlStr = [NSString stringWithFormat:@"delete from %@ where %@ = \"%@\"",tableName,str1,str2];
    
    while ((str=va_arg(ap, NSString*))) {
        
        NSArray *arr = [str componentsSeparatedByString:@"="];
        
        if (arr.count == 2 && [[arr lastObject] length] > 0) {
            
            sqlStr = [NSString stringWithFormat:@"%@ and %@ = \"%@\"",sqlStr,[arr firstObject],[arr lastObject]];
            
        }else
        {
            NSLog(@"请输入正确格式的数据");
            
            return nil;
        }
    }
    
    va_end(ap);
    
    BOOL isInsertData;
    
    if ([self.db open]) {
        
        isInsertData = [self.db executeUpdate:sqlStr];
        
        [self.db close];
    }

    
    return isInsertData;
    
}

直接存入Model数据,取也是取得就是Model数组。超级方便。不管是缓存 还是其他 业务,两句代码搞定一切

相关文章

  • 基于FMDB封装-直接存Model,取Model

    项目中经常遇到数据持久化的问题,直接使用FMDB比较麻烦,我想直接存Model数据源,然后直接建表,存储。 思路是...

  • JQFMDB

    pod 'JQFMDB' FMDB的封装,操作简单,线程安全,扩展性强,直接操作model或dictionary

  • JQFMDB,操作简单,线程安全,扩展性强

    JQFMDB的特性 针对于FMDB的二次封装 线程安全 操作简单, Model和Dictionary直接存储 拓展...

  • iOS 基于FMDB二次封装,直接存储Model

    什么是FMDB 可以直接看大神的文章,很详细。这里不就复制粘贴了~作者:执着_执念 - 《iOS学习笔记17-FM...

  • 使用 YTKKeyValueStore 做 iOS离线缓存(FM

    另一种 JQFMDB FMDB的封装,操作简单,线程安全,扩展性强,直接操作model或dictionary YT...

  • FMDB Model

    配置cocoaPods配置第三方文件 第一步。打开终端 第二步。cd+文件夹 第三步。pod init 第四步。打...

  • un-app基本语法

    1.子组件v-model数据封装 简化封装方式 自动添加单位方法 封装全局方法中 使用 封装后直接写值

  • model模型无法直接转model模型

    model模型无法直接转model模型 可以model转字典,字典再转model: NSDictionary *v...

  • FMDB(ZHY)

    //ViewController代码(model数据以及FMDB包没有上传) #import "ViewContr...

  • layui取值

    1.js里取dom值 2.js里取model值 3.dom里取model值

网友评论

  • jzhang:model增加了字段的情况呢?
    jzhang:@喊我超哥啊 那我必须要喊你超哥了:smirk:
    喊我超哥啊:昨天偶然遇到这种情况,已经生成好了的表,需要动态新加字段。下次更新放上

本文标题:基于FMDB封装-直接存Model,取Model

本文链接:https://www.haomeiwen.com/subject/ibeauttx.html