美文网首页iOS学习iOS开发iOS Developer
IOS自定义类实现数据库操作

IOS自定义类实现数据库操作

作者: Beacon丶 | 来源:发表于2016-09-14 15:21 被阅读470次

    在iOS开发的过程中,偶尔接触到的小项目用到了数据库,所以就利用fmdb这个第三方的框架来进行操作数据,但是用过fmdb的知道,里面的数据库操作语句比较繁琐,在不借助对fmdb进行二次封装的第三方库的帮助下,我们操作这些数据非常的麻烦,所以针对于我自己做的项目,我就封装了一个小的类,来实现对数据库的简单操作,也算是ios开发中的笔记。
    话不多说,上文章。

    1.导入FMDB第三方的库

    2.利用GCD创建存储数据的单例类

    • 利用复合类声明单例类的变量
        static SaveData *_data;
    
    • 利用GCD创建单例
        //自定义类方法
        +(instancetype)shareSaveData
        {
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
    
                _data = [[self alloc] init];
        });
    
            return _data;
        }
        //重写系统的alloc方法
        +(instancetype)allocWithZone:(struct _NSZone *)zone
        {
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                _data = [super allocWithZone:zone];
            });
            return  _data;
        }
    

    3.OC中的initialize方法创建数据库

    • 这个方法是在程序运行一开始就被调用的方法,我们可以利用他们在类被使用前,做一些预处理工作
        //我们在这个方法里进行数据库的创建
         + (void)initialize
        {
            NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"ArtData.db"];
    
            _db =[ FMDatabase databaseWithPath:path];
            if(![_db open])
            {
                return;
            }
        }
    
    

    4.自定义数据库表的增删改查方法

    表的创建方法

    • 自定义方法有三个参数:模型表名和字典数组
    • 利用runtime遍历出模型中的属性,然后利用字符串的方法,拼接出创建表所需要的字符串
        #pragma mark - 截取字符串
    
        -(NSString *)getStr:(NSMutableString *)str
        {
            NSRange range = NSMakeRange(str.length - 1, 1);
    
            [str deleteCharactersInRange:range];
    
            return str;
        }
    
        #截取出所需要的串接下来就可以进行创建表格的操作了
    
        -(void)CreatTable:(id)model AndTableName:(NSString     *)tableName AndArr:(NSArray *)arr
        {
            if([arr count] == 0)
            {
                NSDictionary *dic = [self modelToString:model];
                // 创表
                [_db executeUpdate:[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@)",tableName,dic[@"creatName"]]];
            }
            else
            {
                for(int i = 0; i < [arr count]; i++)
                {
    
                    NSDictionary *dic = [self modelToString:model];
                    // 创表
                    [_db executeUpdate:[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@)",tableName,dic[@"creatName"]]];
                }
            }
        }
        ```
    >表数据的插入
    - 自定义方法有三个参数:**模型**、**表名**、**和字典数组**
    - 利用runtime遍历出模型中的属性,然后利用属性取出属性的值然后就利用拼串和字典 来实现表的插入语句
    
    ```objc
    -(void)InsertDataIntoTable:(id)model AndTableName:(NSString *)tableName AndArr:(NSArray *)arr
    {
        NSMutableArray *valueArray  = [NSMutableArray array];
    
        for(int i = 0; i < [arr count]; i++)
        {
            id dic = arr[i];
    
            if(![dic isKindOfClass:[NSDictionary class]])
            {
                continue;
            }
    
            unsigned int length = 0;
    
            objc_property_t *pro = class_copyPropertyList([model class], &length);
    
            for(int j = 0; j < length; j++)
            {
                objc_property_t name = pro[j];
    
                NSString *keyStr = [NSString stringWithCString:property_getName(name) encoding:NSUTF8StringEncoding];
    
                id value = dic[keyStr];
    
    
                [valueArray addObject:value];
    
            }
    
            NSDictionary *tabledic = [self modelToString:model];
    
            NSString *insertStr = [NSString stringWithFormat:@"INSERT INTO %@(%@) VALUES(%@)", tableName,tabledic[@"insertName"],tabledic[@"quer"]];
    
            [_db executeUpdate:insertStr withArgumentsInArray:valueArray];
    
            //清除数组
            [valueArray removeAllObjects];
        }
    }
    

    查询数据

    • 需要模型 和 表名
    //查询数据
    -(NSMutableArray *)QuertyDataFromTable:(id)model AndTableName:(NSString *)tableName
    {
    
        NSMutableArray *setArray = [NSMutableArray array];
        // 查询数据
        FMResultSet *set = [_db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@",tableName]];
    
    
        while ([set next])
        {
            [setArray addObject:[set resultDictionary]];
        }
        return setArray;
    }
    
    

    删除操作

    //删除制定表中的数据
    -(void)deleteTable:(NSString *)tableStr
    {
        [_db executeUpdate:[@"DELETE FROM " stringByAppendingString:tableStr]];
    
    }
    

    最后的是拼串时候所做的操作

    
    //模型转字符串
    -(NSDictionary *)modelToString:(id)model
    {
    
        //建立表的时候的字符串
        NSMutableString *creatName = [NSMutableString string];
    
        //插入数据时候的字符串
        NSMutableString *insertName = [NSMutableString string];
    
        //插入时候的问号
        NSMutableString *quer = [NSMutableString string];
    
    
        //利用runtime遍历表格
        unsigned int count;
        objc_property_t *pro = class_copyPropertyList([model class], &count);
    
    
        for(int i = 0; i < count; i++)
        {
            objc_property_t name = pro[i];
    
            NSString *keyStr = [NSString stringWithCString:property_getName(name) encoding:NSUTF8StringEncoding];
    
            [creatName appendString:[keyStr stringByAppendingString:@" text,"]];
    
            [insertName appendString:[keyStr stringByAppendingString:@","]];
    
            [quer appendString:@"?,"];
    
        }
    
        //拼接去除字符串最后一位
        [self getStr:creatName];
        [self getStr:insertName];
        [self getStr:quer];
    
        NSDictionary *dic = @{
                              @"creatName":creatName,
                              @"insertName":insertName,
                              @"quer":quer
                              };
    
        return dic;
    }
    
    
    #pragma mark - 截取字符串
    -(NSString *)getStr:(NSMutableString *)str
    {
    
        NSRange range = NSMakeRange(str.length - 1, 1);
    
        [str deleteCharactersInRange:range];
    
        return str;
    }
    

    相关文章

      网友评论

        本文标题:IOS自定义类实现数据库操作

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