閑來無事寫點東西,希望大家多多指正!
大家先去git下載FMDB,然后將其中source文件夾中的fmdb文件夾拖入自己的項目中。最后就可以引用下面的代碼對fmdb進行一次簡單的封裝。
這樣可以更直觀的使用數據庫進行增刪改操作。
/**
* 可以存儲數據類型 text integer blob boolean date
* keyTypes 存儲的字段 以及對應數據類型
* keyValues 存儲的字段 以及對應的值
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "FMDB.h"
@interface YZKDBTool : NSObject
/**
* 數據庫工具單例
*
* @return 數據庫工具對象
*/
+(YZKDBTool *)tool;
/**
* 創建數據庫
*
* @param dbName 數據庫名稱(帶后綴.sqlite)
*/
-(FMDatabase *)getDBWithDBName:(NSString *)dbName;
/**
* 給指定數據庫建表
*
* @param db 指定數據庫對象
* @param tableName 表的名稱
* @param keyTypes 所含字段以及對應字段類型 字典
*/
-(void)DataBase:(FMDatabase *)db createTable:(NSString *)tableName keyTypes:(NSDictionary *)keyTypes;
/**
* 給指定數據庫的表添加值
*
* @param db 數據庫名稱
* @param keyValues 字段及對應的值
* @param tableName 表名
*/
-(void)DataBase:(FMDatabase *)db insertKeyValues:(NSDictionary *)keyValues intoTable:(NSString *)tableName;
/**
* 給指定數據庫的表更新值
*
* @param db 數據庫名稱
* @param keyValues 要更新字段及對應的值
* @param tableName 表名
*/
-(void)DataBase:(FMDatabase *)db updateTable:(NSString *)tableName setKeyValues:(NSDictionary *)keyValues;
/**
* 條件更新
*
* @param db 數據庫名稱
* @param tableName 表名稱
* @param keyValues 要更新的字段及對應值
* @param condition 條件
*/
-(void)DataBase:(FMDatabase *)db updateTable:(NSString *)tableName setKeyValues:(NSDictionary *)keyValues whereCondition:(NSDictionary *)condition;
/**
* 查詢數據庫表中的所有值 限制數據條數10
*
* @param db 數據庫名稱
* @param keysTypes 查詢字段以及對應字段類型 字典
* @param tableName 表名稱
* @return 查詢得到數據
*/
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName;
/**
* 條件查詢數據庫中的數據 限制數據條數10
*
* @param db 數據庫名稱
* @param keysTypes 查詢字段以及對應字段類型 字典
* @param tableName 表名稱
* @param condition 條件
*
* @return 查詢得到數據 限制數據條數10
*/
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName whereCondition:(NSDictionary *)condition;
/**
* 模糊查詢 某字段以指定字符串開頭的數據 限制數據條數10
*
* @param db 數據庫名稱
* @param keysTypes 查詢字段以及對應字段類型 字典
* @param tableName 表名稱
* @param key 條件字段
* @param str 開頭字符串
*
* @return 查詢所得數據 限制數據條數10
*/
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName whereKey:(NSString *)key beginWithStr:(NSString *)str;
/**
* 模糊查詢 某字段包含指定字符串的數據 限制數據條數10
*
* @param db 數據庫名稱
* @param keysTypes 查詢字段以及對應字段類型 字典
* @param tableName 表名稱
* @param key 條件字段
* @param str 所包含的字符串
*
* @return 查詢所得數據
*/
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName whereKey:(NSString *)key containStr:(NSString *)str;
/**
* 模糊查詢 某字段以指定字符串結尾的數據 限制數據條數10
*
* @param db 數據庫名稱
* @param keysTypes 查詢字段以及對應字段類型 字典
* @param tableName 表名稱
* @param key 條件字段
* @param str 結尾字符串
*
* @return 查詢所得數據
*/
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName whereKey:(NSString *)key endWithStr:(NSString *)str;
/**
* 清理指定數據庫中的數據 (只刪除數據不刪除數據庫)
*
* @param db 指定數據庫
*/
-(void)clearDatabase:(FMDatabase *)db from:(NSString *)tableName;
@end
#import "YZKDBTool.h"
static YZKDBTool *tool = nil;
@implementation YZKDBTool
+(YZKDBTool *)tool
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (tool == nil) {
tool = [[self alloc] init];
}
});
return tool;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (tool == nil) {
tool = [super allocWithZone:zone];
}
});
return tool;
}
#pragma mark --創建數據庫
-(FMDatabase *)getDBWithDBName:(NSString *)dbName
{
NSArray *library = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *dbPath = [library[0] stringByAppendingPathComponent:dbName];
NSLog(@"%@", dbPath);
FMDatabase *db = [FMDatabase databaseWithPath:dbPath];
if (![db open]) {
NSLog(@"無法獲取數據庫");
return nil;
}
return db;
}
#pragma mark --給指定數據庫建表
-(void)DataBase:(FMDatabase *)db createTable:(NSString *)tableName keyTypes:(NSDictionary *)keyTypes
{
if ([self isOpenDatabese:db]) {
NSMutableString *sql = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (",tableName]];
int count = 0;
for (NSString *key in keyTypes) {
count++;
[sql appendString:key];
[sql appendString:@" "];
[sql appendString:[keyTypes valueForKey:key]];
if (count != [keyTypes count]) {
[sql appendString:@", "];
}
}
[sql appendString:@")"];
// NSLog(@"%@", sql);
[db executeUpdate:sql];
}
}
#pragma mark --給指定數據庫的表添加值
-(void)DataBase:(FMDatabase *)db insertKeyValues:(NSDictionary *)keyValues intoTable:(NSString *)tableName
{
if ([self isOpenDatabese:db]) {
// int count = 0;
// NSString *Key = [[NSString alloc] init];
// for (NSString *key in keyValues) {
// if(count == 0){
// NSMutableString *sql = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"INSERT INTO %@ (%@) VALUES (?)",tableName, key]];
// [db executeUpdate:sql,[keyValues valueForKey:key]];
// Key = key;
// }else
// {
// NSMutableString *sql = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"UPDATE %@ SET %@ = ? WHERE %@ = ?", tableName, key, Key]];
// [db executeUpdate:sql,[keyValues valueForKey:key],[keyValues valueForKey:Key]];
// }
// count++;
// }
NSArray *keys = [keyValues allKeys];
NSArray *values = [keyValues allValues];
NSMutableString *sql = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"INSERT INTO %@ (", tableName]];
NSInteger count = 0;
for (NSString *key in keys) {
[sql appendString:key];
count ++;
if (count < [keys count]) {
[sql appendString:@", "];
}
}
[sql appendString:@") VALUES ("];
for (int i = 0; i < [values count]; i++) {
[sql appendString:@"?"];
if (i < [values count] - 1) {
[sql appendString:@","];
}
}
[sql appendString:@")"];
NSLog(@"%@", sql);
[db executeUpdate:sql withArgumentsInArray:values];
}
}
#pragma mark --給指定數據庫的表更新值
-(void)DataBase:(FMDatabase *)db updateTable:(NSString *)tableName setKeyValues:(NSDictionary *)keyValues
{
if ([self isOpenDatabese:db]) {
for (NSString *key in keyValues) {
NSMutableString *sql = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"UPDATE %@ SET %@ = ?", tableName, key]];
[db executeUpdate:sql,[keyValues valueForKey:key]];
}
}
}
#pragma mark --條件更新
-(void)DataBase:(FMDatabase *)db updateTable:(NSString *)tableName setKeyValues:(NSDictionary *)keyValues whereCondition:(NSDictionary *)condition
{
if ([self isOpenDatabese:db]) {
for (NSString *key in keyValues) {
NSMutableString *sql = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"UPDATE %@ SET %@ = ? WHERE %@ = ?", tableName, key, [condition allKeys][0]]];
[db executeUpdate:sql,[keyValues valueForKey:key],[keyValues valueForKey:[condition allKeys][0]]];
}
}
}
#pragma mark --查詢數據庫表中的所有值
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName
{
FMResultSet *result = [db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@ LIMIT 10",tableName]];
return [self getArrWithFMResultSet:result keyTypes:keyTypes];
}
#pragma mark --條件查詢數據庫中的數據
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName whereCondition:(NSDictionary *)condition;
{
if ([self isOpenDatabese:db]) {
FMResultSet *result = [db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ = ? LIMIT 10",tableName, [condition allKeys][0]], [condition valueForKey:[condition allKeys][0]]];
return [self getArrWithFMResultSet:result keyTypes:keyTypes];
}else
return nil;
}
#pragma mark --模糊查詢 某字段以指定字符串開頭的數據
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName whereKey:(NSString *)key beginWithStr:(NSString *)str
{
if ([self isOpenDatabese:db]) {
FMResultSet *result = [db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ LIKE %@%% LIMIT 10",tableName, key, str]];
return [self getArrWithFMResultSet:result keyTypes:keyTypes];
}else
return nil;
}
#pragma mark --模糊查詢 某字段包含指定字符串的數據
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName whereKey:(NSString *)key containStr:(NSString *)str
{
if ([self isOpenDatabese:db]) {
FMResultSet *result = [db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ LIKE %%%@%% LIMIT 10",tableName, key, str]];
return [self getArrWithFMResultSet:result keyTypes:keyTypes];
}else
return nil;
}
#pragma mark --模糊查詢 某字段以指定字符串結尾的數據
-(NSArray *)DataBase:(FMDatabase *)db selectKeyTypes:(NSDictionary *)keyTypes fromTable:(NSString *)tableName whereKey:(NSString *)key endWithStr:(NSString *)str
{
if ([self isOpenDatabese:db]) {
FMResultSet *result = [db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ LIKE %%%@ LIMIT 10",tableName, key, str]];
return [self getArrWithFMResultSet:result keyTypes:keyTypes];
}else
return nil;
}
#pragma mark --清理指定數據庫中的數據
-(void)clearDatabase:(FMDatabase *)db from:(NSString *)tableName
{
if ([self isOpenDatabese:db]) {
[db executeUpdate:[NSString stringWithFormat:@"DELETE FROM %@",tableName]];
}
}
#pragma mark --CommonMethod
-(NSArray *)getArrWithFMResultSet:(FMResultSet *)result keyTypes:(NSDictionary *)keyTypes
{
NSMutableArray *tempArr = [NSMutableArray array];
while ([result next]) {
NSMutableDictionary *tempDic = [NSMutableDictionary dictionary];
for (int i = 0; i < keyTypes.count; i++) {
NSString *key = [keyTypes allKeys][i];
NSString *value = [keyTypes valueForKey:key];
if ([value isEqualToString:@"text"]) {
// 字符串
[tempDic setValue:[result stringForColumn:key] forKey:key];
}else if([value isEqualToString:@"blob"])
{
// 二進制對象
[tempDic setValue:[result dataForColumn:key] forKey:key];
}else if ([value isEqualToString:@"integer"])
{
// 帶符號整數類型
[tempDic setValue:[NSNumber numberWithInt:[result intForColumn:key]]forKey:key];
}else if ([value isEqualToString:@"boolean"])
{
// BOOL型
[tempDic setValue:[NSNumber numberWithBool:[result boolForColumn:key]] forKey:key];
}else if ([value isEqualToString:@"date"])
{
// date
[tempDic setValue:[result dateForColumn:key] forKey:key];
}
}
[tempArr addObject:tempDic];
}
return tempArr;
}
-(BOOL)isOpenDatabese:(FMDatabase *)db
{
if (![db open]) {
[db open];
}
return YES;
}
@end