FMDB的简单使用(简单的收藏功能 blob类型与归档、反归档使用实例)

引言

对于做iOS开发的人 FMDB 这个第三方我们是绝对不会陌生。
它大大的方便了我们对 数据库的操作。
今天就用一个简单的收藏功能介绍一下 使用FMDB第三方 来实现简单的增删改查这四个基础的功能操作方法。

首先这四个功能的基础语句在百度上是一抓一大把的

//user 代表 表名 你要取什么名自己替换掉
//user(括号内为数据库代码语句  名称 类型 不可为空 主键(设为主键则不可出现重复具有唯一性)  ,有多个用逗号隔开) 。

//建表
[db executeUpdate:@"create table if not exists user(title text not null primary key)" ];

//增
[db executeUpdate:@"insert into user values(?)",title];

//删
[db executeUpdate:@"delete from user"];

//改
[db executeUpdate:@"update user set title = ? where title = ?",@"新的内容",@"旧的内容"];

//查
[db executeQueryWithFormat:@"select *from collect"];
表设置结果 -- 主要看title就好

实例情景

首先我需要存入的内容有:
1.title:内容名 为text类型 not null不允许为空 primary key给唯一性
2.responseObject:网络请求 JSONS 解析后的字典(使用了AFNetworking所以出来的直接是字典)类型为blob(存放归档类型)
3.image:图片 类型blob
基本上就够了

最开始我们需要创建一个 数据库的类

//.h
#import <Foundation/Foundation.h>

@interface DBManager : NSObject

@property (nonatomic, strong) FMDatabase *db;

//类方法使用即调用
+ (DBManager *)shareInsyance;

@end


//.m
#import "DBManager.h"

@implementation DBManager
//数据库需要在 程序的每个地方都不会被改变  所以我们需要写成单例
+ (DBManager *)shareInsyance{
    static DBManager *db;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        db = [[DBManager alloc] init];
    });
    return db;
}

- (instancetype)init{
    if ([super init]) {
//数据库路径
        NSString *s = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//第一次调用则在此路径下创建program.sql文件 如果已存在直接使用
        NSString *path = [s stringByAppendingString:@"/program.sql"];
        self.db = [FMDatabase databaseWithPath:path];
        NSLog(@"===================%@================",path);
    }
    return self;
}
@end

//写好后 我们在做一个数据库操作类
//为了解释得清楚些所以这回就不用model传值的方法介绍

//.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface ProductDB : NSObject

//创建表格
- (void)createtable;

//添加数据
- (void)insertIntoTable:(NSString *)title responseObject:(NSDictionary *)responseObject image:(UIImage *)image;

//查找数据
- (NSMutableArray *)selectFromTable:(NSString *)title;

//更新数据
- (void)updateTable:(NSString *)title responseObject:(NSDictionary *)responseObject image:(UIImage *)image;

//删除
- (void)deleteTable:(NSString *)title;

@end



//.m
#import "ProductDB.h"
#import "DBManager.h"

@implementation ProductDB

//使用数据库时要注意 操作前打开[DBm.db open] 操作结束后一定要关闭[DBm.db close]
//创建表格 表名collect
- (void)createtable{
    DBManager *dbM = [DBManager shareInsyance];
    if ([dbM.db open]) {
        [DBm.db executeUpdate:@"create table if not exists collect(title text not null primary key, responseObject blob,  image blob)"];
    }
    [dbM.db close];
}

//添加数据
// 字典 和数组 用[NSKeyedArchiver archivedDataWithRootObject:进行归档]   图片用UIImageJPEGRepresentation(image, 1.0)
- (void)insertIntoTable:(NSString *)title responseObject:(NSDictionary *)responseObject image:(UIImage *)image{
        DBManager *dbM = [DBManager shareInsyance];
        [dbM.db open];
        [dbM.db executeUpdate:@"insert into collect values(?,?,?)",title,[NSKeyedArchiver archivedDataWithRootObject:responseObject],UIImageJPEGRepresentation(image, 1.0),];
        [dbM.db close];
}

//查找数据
- (NSMutableArray *)selectFromTable:(NSString *)title{
    NSMutableArray *array = [NSMutableArray array];
    DBManager *dbM = [DBManager shareInsyance];
    [dbM.db open];
//查找是没有条件则把表中所有东西查找
    FMResultSet *set = [dbM.db executeQueryWithFormat:@"select *from collect where title = %@;",title];
    while ([set next]) {
        NSString *s = [set stringForColumn:@"title"];
//反归档字典
        NSData *dataR = [set dataForColumn:@"responseObject"];
        NSDictionary *dic = [NSKeyedUnarchiver unarchiveObjectWithData:dataR];
//反归档图片
        NSData *dataC = [set dataForColumn:@"image"];
        UIImage *image = [UIImage imageWithData:dataC];

        
        //保证image 不在空状态 空图片不能放入数组 避免无数据时崩溃   placeholder.png 为占位图
        if (image == nil) {
            image = [UIImage imageNamed:@"placeholder"];
        }
        
        [array addObject:s];
        [array addObject:dic];
        [array addObject:image];
        [array addObject:arr];
    }
    [dbM.db close];
    
    return array;
}

//更新数据
- (void)updateTable:(NSString *)title responseObject:(NSDictionary *)responseObject image:(UIImage *)image{
    DBManager *dbM = [DBManager shareInsyance];
    if ([dbM.db open]) {
//update collect set 更改数据 = ? where 对应条件 = ? 
        [dbM executeUpdate:@"update collect set responseObject = ?, image = ? where title = ?",[NSKeyedArchiver archivedDataWithRootObject:responseObject],UIImageJPEGRepresentation(image, 1.0),,title];
    }
    [dbM close];
}

//删除
- (void)deleteTable:(NSString *)title{
//1.全部删除 需要全部删除的吧下边拖出去弄成一个方法
    DBManager *dbM = [DBManager shareInsyance];
    if ([dbM.db open]) {
        [dbM.db executeUpdate:@"delete from collect"];
    }
    [dbM.db close];

//2.对应删除
    DBManager *dbM = [DBManager shareInsyance];
    if ([dbM.db open]) {
        [dbM.db executeUpdate:@"delete from collec where title = ?",title];
    }
    [dbM.db close];
}
@end

弄完后就可以开始使用了
1.数据添加

//第一步建表 
[[[ProductDB alloc] init] createtable];

//第二步添加数据 因为设定title一定不能为空  (要在数据加载完全后再添加  如果提前添加 会有两种情况 title 为空 崩溃  除title以外为空 在数据库里会显示nill (可以在加载完后使用更新 进行更改 --> 直接在加载完的地方添加不就好了 MDZZ =- = 所以说收藏里更新没啥用))
[[[ProductDB alloc] init] insertIntoTable:title responseObject:responseObject image:image];

//一般收藏用不到更新··
[[[ProductDB alloc] init] updateTable:title responseObject:responseObject image:image];
添加后在数据库里生成的内容

2.内容展示

//取出数据 (查找)
    self.Array = [[[ProductDB alloc] init] selectAllTable];
//为什么跟上面不同呢=- =  因为既然是展示就需要取出所有内容 所以在原来的基础上 每组数据用数组装好   再装到传出来的数组里 这样就可以拿到全部内容了
/*
        NSMutableArray *item = [NSMutableArray array];
        
        [item addObject:s];
        [item addObject:dic];
        [item addObject:image];
        [array addObject:item];
*/

3.删除内容 (内部实现的差别上面提过了)

//删除单个内容
[[[ProductDB alloc] init] deleteTable:title];
//删除全部内容
[[[ProductDB alloc] init] deleteTable];

到这里收藏的基本功能就都完成了,相对于别的数据库操作 iOS 上的已经算很简单的了。 网上这方面的介绍也蛮多的,我也是闲着没事写一个使用实例给刚接触的新司机朋友提提速,希望需要的朋友能看得明白。

2016 年 8 月20 日 随笔······

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容