FMDB的封装使用(实现对数据的增删改查)

数据库在开发过程是常用到的数据处理工具,在以后的开发过程中也会常常用到,下面我来浅谈一下框架 FMDB的封装使用方案。

首先,我们来封装一个FMDB的BaseManager管理者,在.h文件里添加一个数据库操作对象属性:@property (nonatomic, readonly) FMDatabase *dataBase以及你数据库地址的一个属性;

创建一个管理单例对象:+(YJDataBaseManager *)defaultDBManager;

创建一个连接数据库方法:- (void)connect;

关闭数据库的方法:- (void)close;

在你的.m文件实现方法:首先初始化数据库管理者:+ (YJDataBaseManager *)defaultDBManager {

if (!sharedDBManager) {

sharedDBManager = [[YJDataBaseManager alloc] init];

}

return sharedDBManager;

}

- (id)init {

self = [super init];

if (self) {

int state = [self initializeDBWithName:kDefaultDBName];

if (state == -1) {

NSLog(@"数据库初始化失败");

} else {

NSLog(@"😄数据库初始化成功");

}

}

return self;

}- (id)init {

self = [super init];

if (self) {

int state = [self initializeDBWithName:kDefaultDBName];

if (state == -1) {

NSLog(@"数据库初始化失败");

} else {

NSLog(@"😄数据库初始化成功");

}

}

return self;

}

返回数据库初始化状态(0 为 已经存在,1 为创建成功,-1 为创建失败)

- (int)initializeDBWithName:(NSString *)nameStr

{

if (!nameStr) {

return -1;  // 返回数据库创建失败

}

// 沙盒Docu目录

NSString * docp = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];

name = [docp stringByAppendingString:[NSString stringWithFormat:@"/%@",nameStr]];

NSLog(@"数据库地址-----------%@",name);

NSFileManager * fileManager = [NSFileManager defaultManager];

BOOL exist = [fileManager fileExistsAtPath:name];

[self connect];

if (!exist) {

return 0;

} else {

return 1;          

}

}

连接数据库

- (void)connect

{

if (!_dataBase) {

//根据文件路径来创建FMDatabase对象

_dataBase = [[FMDatabase alloc] initWithPath:name];

}

if (![_dataBase open]) {

NSLog(@"不能打开数据库");

}

}

关闭连接

- (void)close

{

[_dataBase close];

sharedDBManager = nil;

}

到这里已经结束了FMDB管理者的定义封装,接下来我们创建一个用户数据处理的端口,主要用来进行数据的模糊查找、数据添加、数据删除、数据修改的方法。首先在.h文件添加如下方法:

user 需要保存的用户数据:- (void)saveUser:(YJUserModel *)userModel;

uid 需要删除的用户的id:- (void)deleteUserInfoWithId:(NSString *)uid;

需要修改的用户信息:- (void)mergeWithUser:(YJUserModel *)userModel;

模拟分页查找数据:-(NSArray *)findWithUid:(NSString *)uid limit:(int)limit;

标识是否是全称查询or模糊查询  YES(单个查询) ? NO (模糊查询):- (NSArray *)selectWithName:(NSString *)name Bools:(BOOL)bools;

删除数据库文件:- (void)deleteUserInfoWithDB;

创建数据库:- (void)createDataBase;

在.m文件实现以上方法

- (id)init

{

self = [super init];

if (self) {

db = [YJDataBaseManager defaultDBManager].dataBase;

}

return self;

}

- (void)createDataBase

{

FMResultSet *resultSet = [db executeQuery:[NSString stringWithFormat:@"select count(*) from sqlite_master where type ='table' and name = '%@'",kUserName]];

[resultSet next];

NSInteger count = [resultSet intForColumnIndex:0];

BOOL exist = !!count;

if (exist) {

//TODO:数据库已存在

NSLog(@"数据库已存在");

}else{//TODO: 插入新的数据库数据

NSString *sql = @"CREATE TABLE userName (uid INTEGER PRIMARY KEY AUTOINCREMENT  NOT NULL, imgstr VARCHAR(50), name VARCHAR(100), descrite VARCHAR(150))";

BOOL res = [db executeUpdate:sql];

if (!res) {

NSLog(@"数据库创建失败");

}else{

NSLog(@"数据库创建成功");

}

}

}

/**

* @brief 保存一条用户记录

*

* @param userModel 需要保存的用户数据

*/

- (void)saveUser:(YJUserModel *)userModel

{

NSMutableString *query = [NSMutableString stringWithFormat:@"INSERT INTO userName"];

NSMutableString *keys = [NSMutableString stringWithFormat:@" ("];

NSMutableString *values = [NSMutableString stringWithFormat:@" ( "];

NSMutableArray  *arguments = [NSMutableArray arrayWithCapacity:5];

if (userModel.imgstr) {

[keys appendString:@"imgstr,"];

[values appendString:@"?,"];

NSData *dataSTR = [NSData dataWithBase64EncodedString:userModel.imgstr];

NSString *str = [dataSTR base64EncodedString];

[arguments addObject:str];

}

if (userModel.name) {

[keys appendString:@"name,"];

[values appendString:@"?,"];

[arguments addObject:userModel.name];

}

if (userModel.descrite) {

[keys appendString:@"descrite,"];

[values appendString:@"?,"];

[arguments addObject:userModel.descrite];

}

[keys appendString:@")"];

[values appendString:@")"];

[query appendFormat:@" %@ VALUES%@",

[keys stringByReplacingOccurrencesOfString:@",)" withString:@")"],

[values stringByReplacingOccurrencesOfString:@",)" withString:@")"]];

if ([db executeUpdate:query withArgumentsInArray:arguments]) {

NSLog(@"插入一条数据");

}

}

/**

* @brief 删除一条用户数据

*

* @param uid 需要删除的用户的id

*/

- (void)deleteUserInfoWithId:(NSString *)uid

{

NSString *query = [NSString stringWithFormat:@"DELETE FROM userName WHERE uid = '%@'",uid];

if ([db executeUpdate:query]) {

NSLog(@"删除一条数据");

}

}

/**

* @brief 修改用户的信息

*

* @param userModel 需要修改的用户信息

*/

- (void)mergeWithUser:(YJUserModel *)userModel

{

if (!userModel.uid) {

return;

}

NSString *query = @"UPDATE userName SET";

NSMutableString *temp = [NSMutableString stringWithCapacity:20];

if (userModel.imgstr) {

[temp appendFormat:@" imgstr = '%@',",userModel.imgstr];

}

if (userModel.name) {

[temp appendFormat:@" name = '%@',",userModel.name];

}

if (userModel.descrite) {

[temp appendFormat:@" descrite = '%@',",userModel.descrite];

}

[temp appendString:@")"];

query = [query stringByAppendingFormat:@"%@ WHERE uid = '%@'",[temp stringByReplacingOccurrencesOfString:@",)" withString:@""],userModel.uid];

if ([db executeUpdate:query]) {

NSLog(@"修改数据/成功");

}else{

NSLog(@"修改数据/失败");

}

}

/**

* @brief 模拟分页查找数据。取uid大于某个值以后的limit个数据

*

* @param uid

* @param limit 每页取多少个

*/

- (NSArray *)findWithUid:(NSString *)uid limit:(int)limit {

NSString *query = @"SELECT uid,imgstr,name,descrite FROM userName";

if (!uid) {

query = [query stringByAppendingFormat:@" ORDER BY uid DESC limit %d",limit];

} else {

query = [query stringByAppendingFormat:@" WHERE uid > %@ ORDER BY uid DESC limit %d",uid,limit];

}

FMResultSet *resultSet = [db executeQuery:query];

NSMutableArray *array = [NSMutableArray arrayWithCapacity:[resultSet columnCount]];

while ([resultSet next]) {

YJUserModel *userModel = [YJUserModel new];

userModel.uid = [resultSet stringForColumn:@"uid"];

userModel.imgstr = [resultSet stringForColumn:@"imgstr"];

userModel.name = [resultSet stringForColumn:@"name"];

userModel.descrite = [resultSet stringForColumn:@"descrite"];

[array addObject:userModel];

}

[resultSet close];

return array;

}

/**

* @brief 查询用户的信息

*

* @param name 查询的用户信息名称

*

* @bools 标识是否是全称查询/模糊查询  YES(单个查询) ? NO (模糊查询)

*/

- (NSArray *)selectWithName:(NSString *)name Bools:(BOOL)bools

{

NSString *query = [NSString string];

if ([[NSString string] isPureInt:name] || [[NSString string] isPureFloat:name]) {

query = [NSString stringWithFormat:@"SELECT uid,imgstr,name,descrite FROM userName where uid=\"%@\"",name];

}else{

if (bools) {

query = [NSString stringWithFormat:@"SELECT uid,imgstr,name,descrite FROM userName where name=\"%@\"",name];

}else{

query = [NSString stringWithFormat:@"SELECT uid,imgstr,name,descrite FROM userName where name like \"%%%@%%\"",name];

}

}

//将数据库中的数据放到一个集合类FMResultSet中

FMResultSet *resultSet = [db executeQuery:query];

//创建一个动态数组

NSMutableArray *array = [NSMutableArray arrayWithCapacity:[resultSet columnCount]];

//将集合中的数据循环取出,并赋给变动数组,返回值为这个变动数组

while ([resultSet next]) {

YJUserModel *userModel = [YJUserModel new];

userModel.uid = [resultSet stringForColumn:@"uid"];

userModel.imgstr = [resultSet stringForColumn:@"imgstr"];

userModel.name = [resultSet stringForColumn:@"name"];

userModel.descrite = [resultSet stringForColumn:@"descrite"];

[array addObject:userModel];

}

[resultSet close];

return array;

}

/**

* @brief 清除所有用户的信息

*

* @param name  谨记:删除之后哪里使用到数据库需要重新初始化数据

*

* @bools DELETE FROM 删除数据库文件

*/

- (void)deleteUserInfoWithDB

{

NSString * docp = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];

NSString *name = [docp stringByAppendingString:[NSString stringWithFormat:@"/%@",kDefaultDBName]];

db = [FMDatabase databaseWithPath:name];

[db open];

BOOL success =  [db executeUpdate:@"DELETE FROM userName"];

if (success) {

NSLog(@"删除全部数据");

}

[db close];

}

到这就结束了FMDB 的封装,使用的时候根据你自己的数据模型类型创建添加到你的封装的类里面进行数据的处理。

下面看一下效果图

添加的几条数据

插入一条数据:


插入数据

模糊查询:


模糊查询

单个查询、删除、修改的就不在发效果图了,有想了解的需要源码的call我邮箱(bj_yj1991@126.com)留言,我发源码给大家分享。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容