iOS FMDB的用法

本文的适用人群

限于本人自身水平,这篇文章非常的基础,但我会尽量说的非常详细,因为网上的文章大部分只是讲解一下有这个方法,具体怎么用并不是非常的详尽,所以本文不求花式用FMDB,详尽为主,大神们可以直接不用往下看了,怕被喷的体无完肤。。。

写这篇简书的目的

近来项目不是很紧,于是乎就想起来了好久不用的FMDB。为什么好久不用了呢,反正我写的项目几乎都没用到数据库,轻量级的存储用NSUserDefaults足够了,话说在这个网络发达的时代数据一般都是存在后台数据库的吧,毕竟手机更新换代速度贼快,数据存在自己手机里下次登录都没了岂不尴尬,哈哈,废话不多说,上干货~

FMDB的基本介绍

FMDB 头文件,使用之前必须先导入。
FMDatabase 数据库操作类,生成单例数据库操作对象
FMResultSet 数据结果集类,所有往数据库中插入的信息都可以在这个类中查询到

下面正式开始FMDB的使用

1.首先我们一般是要创建一个操作数据库的单例类,这个大家都会,但我还是贴出来吧
+(DataBaseTool *)shareDatabase
{
    static DataBaseTool * manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    manager = [[DataBaseTool alloc]init];
});
return manager;
}
2.为了方便数据库的使用和避免性能的消耗,我们在init方法中指定创建表的路径,我这里放在了documents下,然后在这里创建好了所需要用的表,这样当我们初始化工具类对象之后表就已经创建好了没我们可以直接进行对数据库的增删改查的操作。代码如下:
-(instancetype) init{
if (self = [super init]) {
    //获取doucuments的路径
    NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    //获取database路径
    NSString *databasePath = [documentsURL URLByAppendingPathComponent:@"pinMoeny"].path;
    NSLog(@"databaseURL == %@",databasePath);
    if (![[NSFileManager defaultManager] fileExistsAtPath:databasePath]) {
        //如果不存在表就创建一个表
        BOOL result = [[NSFileManager defaultManager] createFileAtPath:databasePath contents:nil attributes:nil];
        if (result) {
            NSLog(@"数据库文件创建结果-->数据库文件创建成功");
        }else{
            NSLog(@"数据库文件创建结果-->数据库文件创建失败");
        }
    }  
    //创建数据库对象
    _DB = [[FMDatabase alloc]initWithPath:databasePath];
    //操作前先打开,执行后关闭
    [_DB open];
    //没有表先创建一个表
    //这里是一个记录时间和内容的SQL,如何需要其他类型的参数请自行定义。我这里就不多做表述了。
    NSString *sqlStr = @"CREATE TABLE IF NOT EXISTS LQCountAndDate ('CountStr' countStr,'DateStr' dateStr,id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)";
    BOOL result = [_DB executeUpdate:sqlStr];
    if (result) {
        NSLog(@"表创建结果-->表创建成功");
    }else{
        NSLog(@"表创建结果-->表创建失败");
    }
    //如果需要创建其他的表,同上一个表的创建方法,这下边再创建自己需要的表。
//这是一个记录时间内容和image的SQL语句
NSString* SQL = @"CREATE TABLE IF NOT EXISTS ZYDraft    ('Text' text,'Date' date,Image binary,id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)";
    
    BOOL result = [_DB executeUpdate:SQL];
    
    if (result) {
        
        NSLog(@"创建成功");
    }else {
        
        NSLog(@"创建失败");
    }

    //数据库操作完毕之后关闭数据库(否则会造成内存消耗)
    [_DB close];
}
return self;
}
3.创建好了数据库对象接下来就是使用这个对象对数据库进行增删改查的操作了,我们主要用的数据库对象方法有两个(1)executeQuery负责对数据库的查询操作。(2)executeUpdate负责对数据库的增删改操作。下面具体实现一下数据库的插入或者删除操作,首先我们插入一条数据到表中,代码如下
-(void)insertText:(NSString* )text image:(UIImage* )image {
//首先打开数据库
[_DB open];
//写自己需要的插入SQL语句,这里是一个包括文字,时间,和image的SQL语句
NSString* SQL = @"INSERT INTO ZYDraft (Text, Date, Image) VALUES (?, ?, ?)";
//因为我这里的时间是插入时的时间,所以直接去了当前时间
NSDate* date = [NSDate date];
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM-dd HH:mm"];
NSString* dateString = [dateFormatter stringFromDate:date];
//这里image是作为二进制类型存入的
NSData* imageData = UIImagePNGRepresentation(image);
BOOL result = [_DB executeUpdate:SQL, text, dateString, imageData ? imageData : @""];
if (result) {
    NSLog(@"插入成功");
}else {
    NSLog(@"插入失败");
}
//数据库操作完毕之后关闭数据库 
[_DB close];
}
4.上边是插入一条数据,这里给大家写一下查询一张表中所有的数据,代码如下:
-(NSArray* )selectAllDrafts {
//操作前打开数据库
[_database open];
//ORDER BY 指定按那一列排序,默认是升序。
NSString* SQL = @"SELECT * FROM ZYDraft ORDER BY id DESC";
//executeQuery,查询。
//executeUpdate,增删改。
//查询结果是结果集。
FMResultSet* set = [_database executeQuery:SQL];
NSMutableArray* result = [[NSMutableArray alloc] initWithCapacity:0];
//使用 while 循环遍历,取出每一个数据。
//set.next,判断是否还有下一组数据。
while (set.next) {
    //通过列名取。
    NSString* text = [set stringForColumn:@"Text"];
    //通过列索引取。
    NSString* date = [set stringForColumnIndex:1];
    NSData* imageData = [set dataForColumnIndex:2];
    //封装到 model 类中
    ZYDraft* draft = [[ZYDraft alloc] init];
    draft.text = text;
    draft.date = date;
    if (imageData) {
        //在这里将data类型image转化成UIImage类型
        draft.image = [[UIImage alloc] initWithData:imageData];
    }
    [result addObject:draft];
}
//操作完毕之后关闭数据库
[_database close];
return result;
}
6.说完了插入数据和查询数据,删除数据也是必须的,不多说,代码如下:
//删除一条数据记录
-(void)deleteMessageWithId:(NSString *)aId{
//这里解释一下这个id,如果你是在服务器请求的数据有自己的id,那么存数据的时候存一下该条数据的id,这里的aId就是你存的id。
//我这里不是从网络上获取的数据,但又一个自增的id,这个自增的id也具有唯一性,我这里用的就是这个自增的id。
//首先打开数据库
[_DB open];
//删除数据的SQL语句
NSString* SQL = @"DELETE FROM LQCountAndDate WHERE id = ?";
//执行删除的结果
BOOL result = [_DB executeUpdate:SQL,aId];
if (result) {
    NSLog(@"删除结果-->删除一条数据成功");
}else{
    NSLog(@"删除结果-->删除一条数据失败");
}
//关闭数据库
[_DB close];
}
7.到了这里基本上已经说完了,我上面的代码里面不走非常的详细,每一步都有注释,只要认真看,肯定看得懂,当然来大神就不用看了,都是一些最基本的用法。如果有哪里写的不对,欢迎指教,毕竟我也是菜鸟,程序员之路,且行且珍惜~
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容