FMDBTool 简易的 FMDB 封装类

//
//  FMDBTool.h
//  fmdb
//
//  Created by gg on 2017/7/5.
//  Copyright © 2017年 gg. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <FMDB.h>
#import <objc/runtime.h>

/**数据库路径*/
static NSString *DBPath;
/**数据库表名*/
static NSString *DBName;
/**存储字段名*/
static NSString *DBPropertyStr;
/**
 FMDB数据库设置表名称
 只有在 creatDBInfoType=1 时有效
 */
static NSString *FMDBInfoName = @"FMDBInfo";

/**
 0:创建 FMDB数据库设置表(表的数量特别多时建议使用)
 1:创建 NSUserDefaults数据库设置表(默认)
 其他:只创建1个数据库用表时使用
 */
static NSInteger creatDBInfoType = 1;

/**字段类型*/
typedef enum : NSUInteger {
    BOOLType,
    StringType,
    DataType,
    DateType,
    IntegerType,
    FloatType,
    DoubleType,
} FMDBType;


/**
 FMDB 工具类
 */
@interface FMDBTool : NSObject

#pragma mark - init
/**初始化*/
+(FMDBTool *)sharedManager;


#pragma mark - setDBName
/**设置数据库名*/
+(void)setDBName:(NSString *)dbName;




#pragma mark - creat
/**
 创建数据库(必须先调用设置表名方法)

 @param model 传入 model 自动将 model 的属性作为字段并对应数据类型
 */
-(void)createTableWith:(Class)model;
/**
 创建数据库(必须先调用设置表名方法)

 @param sql 创建表的 sql 语句
 */
-(void)createTableWithSQL:(NSString *)sql;
/**
 创建数据库

 @param model 传入 model 自动将 model 的属性作为字段并对应数据类型
 @param key 主键 如果key 为 nil 或 null 或空字符串时主键为自增长的 DBNum
 @param type 数据类型(如果主键为空,这里可以随便填)
 @param name 表名
 */
-(void)createTableWith:(Class)model primaryKey:(NSString *)key attribute:(FMDBType)type DBName:(NSString *)name;


#pragma mark 多线程形式创建表
/**
 创建数据库(必须先调用设置表名方法)

 @param model 传入 model 自动将 model 的属性作为字段并对应数据类型
 */
-(void)Queue_createTableWith:(Class)model;
/**
 创建数据库(必须先调用设置表名方法)

 @param sql 创建表的 sql 语句
 */
-(void)Queue_createTableWithSQL:(NSString *)sql;
/**
 创建数据库

 @param model 传入 model 自动将 model 的属性作为字段并对应数据类型
 @param key 主键 如果key 为 nil 或 null 或空字符串时主键为自增长的 DBNum
 @param type 数据类型(如果主键为空,这里可以随便填)
 @param name 表名
 */
-(void)Queue_createTableWith:(Class)model  primaryKey:(NSString *)key attribute:(FMDBType)type DBName:(NSString *)name;




#pragma mark - add
/**添加一条数据*/
-(void)addDataToDataBase:(NSMutableDictionary *)data DBName:(NSString *)name;

-(void)Queue_addDataToDataBase:(NSMutableDictionary *)data DBName:(NSString *)name;


#pragma mark 添加新字段
/**
 添加新字段

 @param key 字段名
 @param attribute 字段类型
 @param name 表名
 */
-(void)addNewKeyToDataBase:(NSString *)key attribute:(NSString *)attribute DBName:(NSString *)name;
#pragma mark 多线程添加新字段
/**
 添加新字段

 @param key 字段名
 @param attribute 字段类型
 @param name 表名
 */
-(void)Queue_addNewKeyToDataBase:(NSString *)key attribute:(NSString *)attribute DBName:(NSString *)name;




#pragma mark - delete
/**删除数据库*/
-(void)deleteDBFile:(NSString *)name;
/**删除所有数据*/
-(void)deleteDBAllData:(NSString *)name;
//
-(void)Queue_deleteDBAllData:(NSString *)name;




#pragma mark - update
/**更新数据*/
-(void)updateDataToDataBase:(NSString *)sql;
//
-(void)Queue_updateDataToDataBase:(NSString *)sql;




#pragma mark - search
/**查询全部数据*/
-(NSMutableArray *)searchAllData:(NSString *)name;
//
-(NSMutableArray *)Queue_searchAllData:(NSString *)name;
/**搜索指定数据*/
-(NSMutableArray *)searchDataBaseReslust:(NSString *)sql DBName:(NSString *)name;
-(NSMutableArray *)Queue_searchDataBaseReslust:(NSString *)sql DBName:(NSString *)name;
@end

======================================================================

//
//  FMDBTool.m
//  fmdb
//
//  Created by gg on 2017/7/5.
//  Copyright © 2017年 gg. All rights reserved.
//

/* SQL 约束条件
 NOT NULL : 用于控制字段的内容一定不能为空(NULL)
 UNIQUE : 控件字段内容不能重复,一个表允许有多个 Unique 约束
 PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个
 FOREIGN KEY: FOREIGN KEY 约束用于预防破坏表之间连接的动作,FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一
 CHECK: 用于控制字段的值范围
 DEFAULT: 用于设置新记录的默认值
 */

#import "FMDBTool.h"

static FMDBTool *DBTool = nil;
static NSUserDefaults *info;

@implementation FMDBTool{
    /**数据库*/
    FMDatabase *dataBase;
    FMDatabaseQueue *queueDataBase;
    /**存储字段名*/
    NSString *DBPropertyStr;
}

#pragma mark - 创建数据单例模式
+(FMDBTool *)sharedManager{
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        DBTool = [[self alloc] init];
        info = [NSUserDefaults standardUserDefaults];
    });
    return DBTool;
}

#pragma mark - creat
//单线程创建数据库
-(void)createTableWith:(Class)model{
    dataBase = [FMDatabase databaseWithPath:DBPath];
    //打开数据库
    if ([dataBase open]) {
        //开启事务
        [dataBase beginTransaction];
        //回滚标记
        BOOL isRollBack = NO;
        @try {
            // 数据库的sql语句
            NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (DBNum INTEGER PRIMARY KEY AUTOINCREMENT",DBName];
            sql = [self getPropertyWithClass:model sql:sql];
            //判断
            BOOL res = [dataBase executeUpdate:sql];
            if (res) {
                NSLog(@"创建数据库成功");
            }

        } @catch (NSException *exception) {
            NSLog(@"创建数据库失败");
            isRollBack = YES;
            //回滚
            [dataBase rollback];
        } @finally {
            if (!isRollBack) {
                //提交
                [dataBase commit];
            }
        }

        //关闭数据库
        [dataBase close];
    }
}
-(void)createTableWithSQL:(NSString *)sql{
    dataBase = [FMDatabase databaseWithPath:DBPath];
    //打开数据库
    if ([dataBase open]) {
        //开启事务
        [dataBase beginTransaction];
        //回滚标记
        BOOL isRollBack = NO;
        @try {
            //判断
            BOOL res = [dataBase executeUpdate:sql];
            if (res) {
                NSLog(@"创建数据库成功");
            }

        } @catch (NSException *exception) {
            NSLog(@"创建数据库失败");
            isRollBack = YES;
            //回滚
            [dataBase rollback];
        } @finally {
            if (!isRollBack) {
                //提交
                [dataBase commit];
            }
        }

        //关闭数据库
        [dataBase close];
    }
}
-(void)createTableWith:(Class)model primaryKey:(NSString *)key attribute:(FMDBType)type DBName:(NSString *)name{
    [FMDBTool setDBName:name];
    dataBase = [FMDatabase databaseWithPath:DBPath];
    //打开数据库
    if ([dataBase open]) {
        //开启事务
        [dataBase beginTransaction];
        //回滚标记
        BOOL isRollBack = NO;
        @try {
            NSString *attribute = [self getFMDBType:type];
            // 数据库的sql语句
            NSString *sql;
            //如果key 为 nil 或 null 或空字符串时主键为自增长的 DBNum
            if([key isEqualToString:@""]||key==nil||key==NULL){
                sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (DBNum INTEGER PRIMARY KEY AUTOINCREMENT",name];
            }else{
                sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (%@ %@ PRIMARY KEY",name,key,attribute];
            }

            //最后的语句
            sql = [self getPropertyWithClass:model sql:sql];
            //判断
            BOOL res = [dataBase executeUpdate:sql];
            if (res) {
                NSLog(@"创建数据库成功");
            }

        } @catch (NSException *exception) {
            NSLog(@"创建数据库失败");
            isRollBack = YES;
            //回滚
            [dataBase rollback];
        } @finally {
            if (!isRollBack) {
                //提交
                [dataBase commit];
            }
        }

        //关闭数据库
        [dataBase close];
    }
}

//多线程创建数据库
-(void)Queue_createTableWith:(Class)model{
    queueDataBase = [FMDatabaseQueue databaseQueueWithPath:DBPath];
    //事务多线程
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        // 数据库的sql语句
        NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (DBNum INTEGER PRIMARY KEY AUTOINCREMENT",DBName];
        sql = [self getPropertyWithClass:model sql:sql];
        //判断
        BOOL res = [db executeUpdate:sql];
        if (res) {
            NSLog(@"创建数据库成功");
        }else{
            *rollback = YES;
            NSLog(@"创建数据库失败");
            return;
        }
    }];
}
-(void)Queue_createTableWithSQL:(NSString *)sql{
    queueDataBase = [FMDatabaseQueue databaseQueueWithPath:DBPath];
    //事务多线程
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        //判断
        BOOL res = [db executeUpdate:sql];
        if (res) {
            NSLog(@"创建数据库成功");
        }else{
            *rollback = YES;
            NSLog(@"创建数据库失败");
            return;
        }
    }];
}
-(void)Queue_createTableWith:(Class)model  primaryKey:(NSString *)key attribute:(FMDBType)type DBName:(NSString *)name{
    [FMDBTool setDBName:name];
    queueDataBase = [FMDatabaseQueue databaseQueueWithPath:DBPath];
    //事务多线程
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        NSString *attribute = [self getFMDBType:type];
        // 数据库的sql语句
        NSString *sql;
        //如果key 为 nil 或 null 或空字符串时主键为自增长的 DBNum
        if([key isEqualToString:@""]||key==nil||key==NULL){
            sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (DBNum INTEGER PRIMARY KEY AUTOINCREMENT",name];
        }else{
            sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (%@ %@ PRIMARY KEY",name,key,attribute];
        }

        //最后的 sql 语句
        sql = [self getPropertyWithClass:model sql:sql];
        //判断
        BOOL res = [db executeUpdate:sql];
        if (res) {
            NSLog(@"创建数据库成功");
        }else{
            *rollback = YES;
            NSLog(@"创建数据库失败");
            return;
        }
    }];
}



#pragma mark -  add
//添加数据
-(void)addDataToDataBase:(NSMutableDictionary *)data DBName:(NSString *)name{
    //开启数据库
    if ([dataBase open]) {
        //开启事务
        [dataBase beginTransaction];
        //回滚标记
        BOOL isRollBack = NO;
        @try {
            //所有的 value 值
            NSString *valuesStr = @"";
            NSString *keyStr = @"";
            //循环遍历取出 value
            NSMutableArray *allKeyArray = [self getAllKeys:name];
            NSMutableArray *allAttributeArray = [self getAllAttributes:name];
            for (int i = 0; i<allKeyArray.count; i++) {
                NSString *key = [allKeyArray objectAtIndex:i];
                NSString *attribute = [allAttributeArray objectAtIndex:i];

                BOOL isTrue = [dataBase columnExists:key inTableWithName:name];
                if (isTrue==NO) {
                    continue;
                }
                //取出当前 value
                NSString *value;
                if ([[data valueForKey:key] isKindOfClass:[NSNull class]]||[data valueForKey:key]==nil||[data valueForKey:key]==NULL) {
                    value = @"";
                }else{
                    value = [data valueForKey:key];
                }

                //如果是最后一个则不加逗号
                if ([key isEqualToString:[allKeyArray lastObject]]){
                    keyStr = [keyStr stringByAppendingString:[NSString stringWithFormat:@"%@",key]];
                    //判断是否是数字类型
                    if ([attribute isEqualToString:@"1"]) {
                        valuesStr = [valuesStr stringByAppendingString:[NSString stringWithFormat:@"'%@'",value]];
                    }else{
                        valuesStr = [valuesStr stringByAppendingString:[NSString stringWithFormat:@"%@",value]];
                    }
                }else{
                    keyStr = [keyStr stringByAppendingString:[NSString stringWithFormat:@"%@,",key]];
                    //判断是否是数字类型
                    if ([attribute isEqualToString:@"1"]) {
                        valuesStr = [valuesStr stringByAppendingString:[NSString stringWithFormat:@"'%@',",value]];
                    }else{
                        valuesStr = [valuesStr stringByAppendingString:[NSString stringWithFormat:@"%@,",value]];
                    }
                }
            }

            //查询语句
            NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@ (%@) VALUES ('%@')",name,keyStr,valuesStr];
            BOOL res = [dataBase executeUpdate:sql];
            if (res) {
                NSLog(@"数据插入成功");
            }
        } @catch (NSException *exception) {
            NSLog(@"数据插入失败");
            isRollBack = YES;
            //回滚
            [dataBase rollback];
        } @finally {
            if (!isRollBack) {
                //提交
                [dataBase commit];
            }
        }
        //关闭数据库
        [dataBase close];
    }
}
//多线程添加数据
-(void)Queue_addDataToDataBase:(NSMutableDictionary *)data DBName:(NSString *)name{
    //事务多线程
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        //所有的 value 值
        NSString *valuesStr = @"";
        NSString *keyStr = @"";
        //循环遍历取出 value
        NSMutableArray *allKeyArray = [self getAllKeys:name];
        NSMutableArray *allAttributeArray = [self getAllAttributes:name];
        for (int i = 0; i<allKeyArray.count; i++) {
            NSString *key = [allKeyArray objectAtIndex:i];
            NSString *attribute = [allAttributeArray objectAtIndex:i];

            BOOL isTrue = [db columnExists:key inTableWithName:name];
            if (isTrue==NO) {
                continue;
            }
            //取出当前 value
            NSString *value;
            if ([[data valueForKey:key] isKindOfClass:[NSNull class]]||[data valueForKey:key]==nil||[data valueForKey:key]==NULL) {
                value = @"";
            }else{
                value = [data valueForKey:key];
            }

            //如果是最后一个则不加逗号
            if ([key isEqualToString:[allKeyArray lastObject]]){
                NSLog(@"%@===%@",key,[allKeyArray lastObject]);
                keyStr = [keyStr stringByAppendingString:[NSString stringWithFormat:@"%@",key]];
                //判断是否是数字类型
                if ([attribute isEqualToString:@"1"]) {
                    valuesStr = [valuesStr stringByAppendingString:[NSString stringWithFormat:@"'%@'",value]];
                }else{
                    valuesStr = [valuesStr stringByAppendingString:[NSString stringWithFormat:@"%@",value]];
                }
            }else{
                keyStr = [keyStr stringByAppendingString:[NSString stringWithFormat:@"%@,",key]];
                //判断是否是数字类型
                if ([attribute isEqualToString:@"1"]) {
                    valuesStr = [valuesStr stringByAppendingString:[NSString stringWithFormat:@"'%@',",value]];
                }else{
                    valuesStr = [valuesStr stringByAppendingString:[NSString stringWithFormat:@"%@,",value]];
                }
            }
        }

        //查询语句
        NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@ (%@) VALUES (%@)",name,keyStr,valuesStr];
        BOOL res = [db executeUpdate:sql];
        if (res) {
            NSLog(@"数据插入成功");
        }else{
            NSLog(@"数据插入失败");
            *rollback = YES;
            return ;
        }
    }];
}

//增加字段
-(void)addNewKeyToDataBase:(NSString *)key attribute:(NSString *)attribute DBName:(NSString *)name{
    //打开数据库
    if ([dataBase open]) {
        //开启事务
        [dataBase beginTransaction];
        //事务标记
        BOOL isRollBack = NO;
        @try {
            //判断字段是否存在
            if (![dataBase columnExists:key inTableWithName:name]) {
                NSString *sql = [NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ %@",name,key,attribute];
                BOOL ret = [dataBase executeUpdate:sql];
                if (ret) {
                    NSLog(@"新字段增加成功");
                }
            }
        } @catch (NSException *exception) {
            NSLog(@"新字段增加失败");
            isRollBack = YES;
            //回滚
            [dataBase rollback];
        } @finally {
            if (!isRollBack) {
                //提交
                [dataBase commit];
            }
        }
        //关闭数据库
        [dataBase close];
    }
}
//多线程添加字段
-(void)Queue_addNewKeyToDataBase:(NSString *)key attribute:(NSString *)attribute DBName:(NSString *)name{
    //事务多线程
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        //判断字段是否存在
        if (![dataBase columnExists:key inTableWithName:name]) {
            NSString *sql = [NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ %@",name,key,attribute];
            BOOL ret = [db executeUpdate:sql];
            if (ret) {
                NSLog(@"新字段增加成功");
            }else{
                NSLog(@"新字段增加失败");
                *rollback = YES;
                return ;
            }
        }
    }];
}

#pragma mark - search
//查询所有数据
-(NSMutableArray *)searchAllData:(NSString *)name{
    //总数组
    NSMutableArray *dataArray = [[NSMutableArray alloc]init];
    //开启数据库
    if ([dataBase open]){
        //开启事务
        [dataBase beginTransaction];
        //事务标记
        BOOL isRollBack = NO;
        @try {
            FMResultSet *resultSet = [dataBase executeQuery:[NSString stringWithFormat:@"select * from %@",name]];
            while ([resultSet next]) {
                NSMutableDictionary *dataDic = [[NSMutableDictionary alloc]init];
               NSMutableArray *DBPropertyArray = [info valueForKey:[NSString stringWithFormat:@"%@Property",name]];
                for (NSString *value in DBPropertyArray) {
                    [dataDic setObject:[resultSet stringForColumn:value]forKey:value];
                }
                [dataArray addObject:dataDic];
            }
            //            NSLog(@"查询全部数据:%@",dataArray);
        } @catch (NSException *exception) {
            isRollBack = YES;
            //回滚
            [dataBase rollback];
        } @finally {
            if (!isRollBack) {
                //提交
                [dataBase commit];
            }
        }
        //关闭数据库
        [dataBase close];;
    }

    return dataArray;
}

//多线程查询所有数据
-(NSMutableArray *)Queue_searchAllData:(NSString *)name{
    //总数组
    NSMutableArray *dataArray = [[NSMutableArray alloc]init];
    //事务多线程
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        FMResultSet *resultSet = [db executeQuery:[NSString stringWithFormat:@"select * from %@",name]];
        while ([resultSet next]) {
            NSMutableDictionary *dataDic = [[NSMutableDictionary alloc]init];
            NSMutableArray *DBPropertyArray = [info valueForKey:[NSString stringWithFormat:@"%@Property",name]];
            for (NSString *value in DBPropertyArray) {
                if ([db columnExists:value inTableWithName:DBName]) {
                    [dataDic setObject:[resultSet stringForColumn:value]forKey:value];
                }
            }
            [dataArray addObject:dataDic];
        }
//        NSLog(@"查询全部数据:%@",dataArray);
    }];
    return dataArray;
}

//搜索指定数据
-(NSMutableArray *)searchDataBaseReslust:(NSString *)sql DBName:(NSString *)name{
    //总数组
    NSMutableArray *dataArray = [[NSMutableArray alloc]init];
    //打开数据库
    if ([dataBase open]){
        //开启事务
        [dataBase beginTransaction];
        //事务标记
        BOOL isRollBack = NO;
        @try {
            FMResultSet *resultSet = [dataBase executeQuery:sql];
            while ([resultSet next]) {
                NSMutableDictionary *dataDic = [[NSMutableDictionary alloc]init];
                NSMutableArray *DBPropertyArray = [info valueForKey:[NSString stringWithFormat:@"%@Property",name]];
                for (NSString *name in DBPropertyArray) {
                    [dataDic setObject:[resultSet stringForColumn:name]forKey:name];
                }
                [dataArray addObject:dataDic];
            }
            NSLog(@"查询全部数据:%@",dataArray);
        } @catch (NSException *exception) {
            isRollBack = YES;
            //回滚
            [dataBase rollback];
        } @finally {
            if (!isRollBack) {
                //提交
                [dataBase commit];
            }
        }
        //关闭数据库
        [dataBase close];;
    }
    return dataArray;
}

//多线程搜索指定数据
-(NSMutableArray *)Queue_searchDataBaseReslust:(NSString *)sql DBName:(NSString *)name{
    //总数组
    NSMutableArray *dataArray = [[NSMutableArray alloc]init];
    //事务多线程
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        FMResultSet *resultSet = [db executeQuery:sql];
        while ([resultSet next]) {
            NSMutableDictionary *dataDic = [[NSMutableDictionary alloc]init];
            NSMutableArray *DBPropertyArray = [info valueForKey:[NSString stringWithFormat:@"%@Property",name]];
            for (NSString *name in DBPropertyArray) {
                [dataDic setObject:[resultSet stringForColumn:name]forKey:name];
            }
            [dataArray addObject:dataDic];
        }
        NSLog(@"查询全部数据:%@",dataArray);
    }];
    return dataArray;
}

#pragma mark - update
//更新数据
-(void)updateDataToDataBase:(NSString *)sql{
    //打开数据库
    if ([dataBase open]){
        //开启事务
        [dataBase beginTransaction];
        //事务标记
        BOOL isRollBack = NO;
        @try {
            BOOL res = [dataBase executeUpdate:sql];
            if (res) {
                NSLog(@"数据更新成功:%@",sql);
            }
        } @catch (NSException *exception) {
            NSLog(@"数据更新失败:%@",sql);
            isRollBack = YES;
            //回滚
            [dataBase rollback];
        } @finally {
            if (!isRollBack) {
                //提交
                [dataBase commit];
            }
        }
        //关闭数据库
        [dataBase close];
    }
}

//多线程更新数据
-(void)Queue_updateDataToDataBase:(NSString *)sql{
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        BOOL res = [db executeUpdate:sql];
        if (res) {
            NSLog(@"数据更新成功:%@",sql);
        } else {
            NSLog(@"数据更新失败:%@",sql);
            *rollback = YES;
            return ;
        }
    }];
}

#pragma mark - delete
//删除所有数据
-(void)deleteDBAllData:(NSString *)name{
    //打开数据库
    if ([dataBase open]) {
        //开启事务
        [dataBase beginTransaction];
        //事务标记
        BOOL isRollBack = NO;
        @try {
            NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@",name];
            BOOL res = [dataBase executeUpdate:sql];
            if (res) {
                NSLog(@"数据删除成功");
            }
        } @catch (NSException *exception) {
            NSLog(@"数据删除失败");
            isRollBack = YES;
            //回滚
            [dataBase rollback];
        } @finally {
            if (!isRollBack) {
                //提交
                [dataBase commit];
            }
        }
        //关闭数据库
        [dataBase close];
    }
}

//多线程删除所有数据
-(void)Queue_deleteDBAllData:(NSString *)name{
    //事务多线程
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@",name];
        BOOL res = [db executeUpdate:sql];
        if (res) {
            NSLog(@"数据删除成功");
        } else {
            *rollback = YES;
            NSLog(@"数据删除失败");
            return ;
        }
    }];
}

//删除数据库
-(void)deleteDBFile:(NSString *)name{
    NSFileManager *fileMgr = [NSFileManager defaultManager];
    BOOL bRet = [fileMgr fileExistsAtPath:name];
    if (bRet) {
        NSError *err;
        BOOL result = [fileMgr removeItemAtPath:name error:&err];
        if (result) {
            NSLog(@"数据库删除成功:%@",name);
        }else{
            NSLog(@"数据库删除失败:%@",name);
        }
    }
}

#pragma mark - tool
//数据库名
+(void)setDBName:(NSString *)dbName{
    //表名
    DBName = dbName;
    //数据库路径
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    DBPath = [documentDirectory stringByAppendingPathComponent:dbName];
    NSLog(@"数据库路径:%@",DBPath);
}
//获取 model 的所有属性
-(NSString *)getPropertyWithClass:(Class)model sql:(NSString *)sql{
    NSMutableArray *DBPropertyArray = [[NSMutableArray alloc]init];
    NSMutableArray *DBAttributeArray = [[NSMutableArray alloc]init];
    // 获取当前类的所有属性
    unsigned int count;// 记录属性个数
    objc_property_t *properties = class_copyPropertyList(model, &count);

    //循环取出属性
    for (int i = 0; i < count; i++) {
        // objc_property_t 属性类型
        objc_property_t property = properties[i];
        // 获取属性的名称 C语言字符串
        const char *cName = property_getName(property);
        const char *cAttribute = property_getAttributes(property);

        // 转换为Objective C 字符串
        NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
        NSString *attribute = [NSString stringWithCString:cAttribute encoding:NSUTF8StringEncoding];
        NSArray *array = [attribute componentsSeparatedByString:@","];
        attribute = [array objectAtIndex:0];

        //判断是什么类型并加入存放类型的数组中
        //T?是表示数据类型可以通过NSLog(@"%@",attribute);查看
        if ([attribute containsString:@"NSData"]) {
            attribute = @"data";
            [DBAttributeArray addObject:@"1"];
        }else if ([attribute containsString:@"NSDate"]){
            attribute = @"date";
            [DBAttributeArray addObject:@"1"];
        }else if ([attribute containsString:@"Tq"]||[attribute containsString:@"Ti"]){
            attribute = @"integer";
            [DBAttributeArray addObject:@"0"];
        }else if ([attribute containsString:@"Tb"]||[attribute containsString:@"BOOL"]){
            attribute = @"blob";
            [DBAttributeArray addObject:@"0"];
        }else if ([attribute containsString:@"Tf"]){
            attribute = @"float";
            [DBAttributeArray addObject:@"0"];
        }else if ([attribute containsString:@"Td"]){
            attribute = @"double";
            [DBAttributeArray addObject:@"0"];
        }else{
            attribute = @"text";
            [DBAttributeArray addObject:@"1"];
        }

        //将属性名和数据类型拼接到一起
        sql = [sql stringByAppendingString:[NSString stringWithFormat:@" ,%@ %@",name,attribute]];
        //取得所有属性并拼成字符串
        if (i==0) {
            DBPropertyStr = [NSMutableString stringWithString:name];
        }else{
            NSString *str = [NSString stringWithFormat:@" ,%@",name];
            DBPropertyStr = [DBPropertyStr stringByAppendingString:str];
        }
        //将属性添加到数组中
        [DBPropertyArray addObject:name];
    }

    //创建数据库设置表
    if (creatDBInfoType==0) {
        [self createDBInfo];
        NSMutableDictionary *FMDBInfoDic = [NSMutableDictionary dictionary];
        [FMDBInfoDic setObject:DBPropertyArray forKey:@"DBPropertyArray"];
        [FMDBInfoDic setObject:DBAttributeArray forKey:@"DBAttributeArray"];
        [FMDBInfoDic setObject:DBPath forKey:@"DBPath"];
        [self Queue_addDataToDataBase:FMDBInfoDic DBName:FMDBInfoName];
    }else if(creatDBInfoType==1){
        [info setObject:DBPropertyArray forKey:[NSString stringWithFormat:@"%@Property",DBName]];
        [info setObject:DBAttributeArray forKey:[NSString stringWithFormat:@"%@Attribute",DBName]];
        [info setObject:DBPath forKey:[NSString stringWithFormat:@"%@DBPath",DBPath]];
        [info synchronize];
    }

    sql = [sql stringByAppendingString:@")"];
    return sql;
}
//获取数据类型
-(NSString *)getFMDBType:(FMDBType)type{
    NSString *str = @"text";
    switch (type) {
        case DataType:
            str = @"data";
            break;
        case DateType:
            str = @"date";
            break;
        case BOOLType:
            str = @"bool";
            break;
        case DoubleType:
            str = @"double";
            break;
        case FloatType:
            str = @"float";
            break;
        case IntegerType:
            str = @"integer";
            break;
        default:
            break;
    }
    return str;
}
//获取字段
-(NSMutableArray *)getAllKeys:(NSString *)name{
    NSMutableArray *keyArray = [NSMutableArray array];
    if (creatDBInfoType==0) {
        keyArray = [self searchAllData:FMDBInfoName];
    }else{
        keyArray = [info valueForKey:[NSString stringWithFormat:@"%@Property",name]];
    }
    return keyArray;
}
//获取类型
-(NSMutableArray *)getAllAttributes:(NSString *)name{
    NSMutableArray *AttributeArray = [NSMutableArray array];
    if (creatDBInfoType==0) {
        AttributeArray = [self searchAllData:FMDBInfoName];
    }else{
        AttributeArray = [info valueForKey:[NSString stringWithFormat:@"%@Attribute",name]];
    }
    return AttributeArray;
}

#pragma mark - DBInfo
//数据库设置用建表
-(void)createDBInfo{
    queueDataBase = [FMDatabaseQueue databaseQueueWithPath:DBPath];
    //事务多线程
    [queueDataBase inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
        // 数据库的sql语句
        NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (DBNum INTEGER PRIMARY KEY AUTOINCREMENT,DBPropertyArray data ,DBAttributeArray data,DBPath text,DBName text",FMDBInfoName];
        //判断
        BOOL res = [db executeUpdate:sql];
        if (res) {
            NSLog(@"创建数据库成功");
        }else{
            *rollback = YES;
            NSLog(@"创建数据库失败");
            return;
        }
    }];
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值