在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;
}