闲来无事写点东西,希望大家多多指正!

大家先去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

iOS菜鸟之FMDB的二次封装简单易用的更多相关文章

  1. iOS菜鸟之AFN的二次封装

    我用一个单例类将一些常用的网络请求进行了二次封装,主要包括post请求 get请求  图片文件上传下载  视频的断点续传等功能. 首先大家先去github上下载AFN,将文件夹内的AFNetworki ...

  2. android菜鸟学习笔记22----ContentProvider(二)ContentObserver的简单使用

    现在有这样一个应用A通过ContentProvider提供自己的数据给其他应用,应用B通过ContentResolver获取应用A中提供的数据,并将其展示在ListView中,而应用C通过Conten ...

  3. FMDB 二次封装工具类,让你快速学会封装,集成数据库

    来源:StrivEver 链接:http://www.jianshu.com/p/4c77aee0b41c 上个版本为了增加用户体验,部分页面集成了离线缓存数据功能,于是就在项目里使用了数据库管理离线 ...

  4. Python实现Paramiko的二次封装

    Paramiko是一个用于执行SSH命令的Python第三方库,使用该库可实现自动化运维的所有任务,如下是一些常用代码的封装方式,多数代码为半成品,只是敲代码时的备份副本防止丢失,仅供参考,目前本人巡 ...

  5. ios MBProgressHUD 使用,及二次封装

    MBProgressHUD是一个显示HUD窗口的第三方类库,用于在执行一些后台任务时,在程序中显示一个表示进度的loading视图和两个可选的文本提示的HUD窗口.MBProgressHUD 二次封装 ...

  6. iOS项目相关@AFN&SDWeb的二次封装

    一,AFNetworking跟SDWebImge是功能强大且常用的第三方,然而在实际应用中需要封装用来复用今天就跟大家分享一下AFN&SDWeb的二次封装 1. HttpClient.h及.m ...

  7. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  8. iOS开发之微信聊天工具栏的封装

    之前山寨了一个新浪微博(iOS开发之山寨版新浪微博小结),这几天就山寨个微信吧.之前已经把微信的视图结构简单的拖了一下(IOS开发之微信山寨版),今天就开始给微信加上具体的实现功能,那么就先从微信的聊 ...

  9. iOS开发UI篇—核心动画(UIView封装动画)

    iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...

随机推荐

  1. How to read video frames in hadoop?如何在Hadoop中读取视频帧?

    To process specialized file formats (such as video) in Hadoop, you'd have to write a custom InputFor ...

  2. bzoj1560

    首先这种题目肯定是要先排序,以x为第一关键字,y为第二关键字不难想到O(n2)的dp,下面显然要优化不难发现,由于两点的耗费是坐标差的平方的和,不带根号,因此,不难发现一个很有用的性质,如果从A点能到 ...

  3. HDU 5927 Auxiliary Set 【DFS+树】(2016CCPC东北地区大学生程序设计竞赛)

    Auxiliary Set Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  4. 《University Calculus》-chape8-无穷序列和无穷级数-欧拉恒等式

    写在前面:写在前面的当然是对大天朝教材的吐槽啦. 曾记否,高中所学虚数和复平面的概念,如此虚无的概念到了大学一门叫<模拟电子技术>的课程中居然明目张胆的开始进行计算! 曾记否,高中的指对运 ...

  5. LOL游戏程序中对一些函数的Hook记录(Win10 x64)

    [PC Hunter Standard][League of Legends.exe-->Ring3 Hook]: 108Hooked Object Hook Address and Locat ...

  6. HTTP协议介绍(SERVLET)

    本文是servlet的入门篇,主要简单介绍下http协议 1.什么是HTTP _ 1.http协议:_1. 复杂解释:   http(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议 ...

  7. nyoj 95 众数问题【水】

    众数问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多重集合S重 ...

  8. CMS收集器

    CMS收集周期 CMS并非没有暂停,而是用两次短暂停来替代串行标记整理算法的长暂停,它的收集周期是这样:初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent ...

  9. winform 播放声音方式 分类: WinForm 2014-07-25 14:16 194人阅读 评论(0) 收藏

    声音文件folder.wav放置在bin目录下debug下 1.通过API调用 [c-sharp] view plaincopy using System.Runtime.InteropService ...

  10. (转)LINUX的端口和服务

    一.端口和服务的关系 端口号与相应服务的对应关系存放在/etc/services文件中,这个文件中可以找到大部分端口.使用netstat命令显示的服务名称也是从这个文件中找的.有人说将这个文件中的相应 ...