在iOS開發(fā)的過程中绰更,偶爾接觸到的小項目用到了數(shù)據(jù)庫,所以就利用fmdb這個第三方的框架來進行操作數(shù)據(jù)倦挂,但是用過fmdb的知道楷拳,里面的數(shù)據(jù)庫操作語句比較繁瑣,在不借助對fmdb進行二次封裝的第三方庫的幫助下东亦,我們操作這些數(shù)據(jù)非常的麻煩杏节,所以針對于我自己做的項目,我就封裝了一個小的類典阵,來實現(xiàn)對數(shù)據(jù)庫的簡單操作奋渔,也算是ios開發(fā)中的筆記。
話不多說壮啊,上文章嫉鲸。
1.導入FMDB第三方的庫
2.利用GCD創(chuàng)建存儲數(shù)據(jù)的單例類
- 利用復合類聲明單例類的變量
static SaveData *_data;
- 利用GCD創(chuàng)建單例
//自定義類方法
+(instancetype)shareSaveData
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_data = [[self alloc] init];
});
return _data;
}
//重寫系統(tǒng)的alloc方法
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_data = [super allocWithZone:zone];
});
return _data;
}
3.OC中的initialize方法創(chuàng)建數(shù)據(jù)庫
- 這個方法是在程序運行一開始就被調(diào)用的方法,我們可以利用他們在類被使用前歹啼,做一些預處理工作
//我們在這個方法里進行數(shù)據(jù)庫的創(chuàng)建
+ (void)initialize
{
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"ArtData.db"];
_db =[ FMDatabase databaseWithPath:path];
if(![_db open])
{
return;
}
}
4.自定義數(shù)據(jù)庫表的增刪改查方法
表的創(chuàng)建方法
- 自定義方法有三個參數(shù):模型玄渗、表名、和字典數(shù)組
- 利用runtime遍歷出模型中的屬性狸眼,然后利用字符串的方法藤树,拼接出創(chuàng)建表所需要的字符串
#pragma mark - 截取字符串
-(NSString *)getStr:(NSMutableString *)str
{
NSRange range = NSMakeRange(str.length - 1, 1);
[str deleteCharactersInRange:range];
return str;
}
#截取出所需要的串接下來就可以進行創(chuàng)建表格的操作了
-(void)CreatTable:(id)model AndTableName:(NSString *)tableName AndArr:(NSArray *)arr
{
if([arr count] == 0)
{
NSDictionary *dic = [self modelToString:model];
// 創(chuàng)表
[_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];
// 創(chuàng)表
[_db executeUpdate:[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@)",tableName,dic[@"creatName"]]];
}
}
}
```
>表數(shù)據(jù)的插入
- 自定義方法有三個參數(shù):**模型**、**表名**拓萌、**和字典數(shù)組**
- 利用runtime遍歷出模型中的屬性岁钓,然后利用屬性取出屬性的值然后就利用拼串和字典 來實現(xiàn)表的插入語句
```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];
//清除數(shù)組
[valueArray removeAllObjects];
}
}
查詢數(shù)據(jù)
- 需要模型 和 表名
//查詢數(shù)據(jù)
-(NSMutableArray *)QuertyDataFromTable:(id)model AndTableName:(NSString *)tableName
{
NSMutableArray *setArray = [NSMutableArray array];
// 查詢數(shù)據(jù)
FMResultSet *set = [_db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@",tableName]];
while ([set next])
{
[setArray addObject:[set resultDictionary]];
}
return setArray;
}
刪除操作
//刪除制定表中的數(shù)據(jù)
-(void)deleteTable:(NSString *)tableStr
{
[_db executeUpdate:[@"DELETE FROM " stringByAppendingString:tableStr]];
}
最后的是拼串時候所做的操作
//模型轉(zhuǎn)字符串
-(NSDictionary *)modelToString:(id)model
{
//建立表的時候的字符串
NSMutableString *creatName = [NSMutableString string];
//插入數(shù)據(jù)時候的字符串
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;
}