美文网首页iOS
FMDB的简单使用(简单的收藏功能 blob类型与归档、反归档使

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

作者: 左燈右荇丶 | 来源:发表于2016-08-20 17:50 被阅读560次

引言

对于做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 日 随笔······

相关文章

网友评论

本文标题:FMDB的简单使用(简单的收藏功能 blob类型与归档、反归档使

本文链接:https://www.haomeiwen.com/subject/vxdisttx.html