//
// 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