关于FMDB-本地数据库【简单基础教学】

最近给我媳妇写一个微商用的app。主要功能就是
1。销售记录 添加 查询 删除 修改
2。进货记录 添加 查询 删除 修改
3。常用广告语 一键复制 增加 修改 查询 删除
4。财务记录 各种进出账目统计

嗯 就是一个本地数据库app 不需要网络请求【主要是因为我不会后台。。。】

好吧 废话不多说 下面开始讲解

在这里 必须要感谢一下 好基友【大刘】 嗯 帮我学习了FMDB 并且给我写了一个demo 哈哈哈


1.加载FMDB

首先当然是在程序中 加载FMDB了 不然怎么用
传送门--点击我跳转下载链接

2.FMDB简单介绍

嗯 对于从来没用过这个功能的朋友来说 只是简单知道 这是一个方便 处理数据存储本地的第三方

其实 他只是给我们更好的封装了 SQL语句系统自带的存储方法

SQL语句 是我写iOS以来 遇到过第二恶心的东西 第一个是WebService

在 FMDB 中有三个重要的类:

FMDatabase:是一个提供 SQLite 数据库的类,用于执行 SQL 语句。
FMResultSet:用在 FMDatabase 中执行查询的结果的类。
FMDatabaseQueue:在多线程下查询和更新数据库用到的类。

3. 下面根据demo讲解 FMDB

//创建数据库
@interface FMDBForSell ()
{
     FMDatabase *dateBase;
}
@end

- (BOOL)createDataBaseWithName:(NSString *)name{
    //创建数据库
    NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    dateBase = [FMDatabase databaseWithPath:[path stringByAppendingString:[NSString stringWithFormat:@"/%@",name]]];
    return [dateBase open];
}
//创建表
- (BOOL)createTableWithDic:(NSArray *)arr{
    NSMutableString *creat = [NSMutableString stringWithString:@"create table if not exists t_user(id integer primary key)"];
    for (NSString *per in arr) {
        [creat insertString:[NSString stringWithFormat:@",%@ varchar", per] atIndex:creat.length-1];
    }
    return [dateBase executeUpdate:creat];
}

首先第一步肯定是创建数据库 并且在数据库中创建表格

使用方法:

-(void)addFMDB
{
    manager = [[FMDBForSell alloc] init];
    
    //创建数据库
    BOOL open = [manager createDataBaseWithName:@"abc.splist"];
    //打开数据库
    if (open) {
        NSLog(@"数据库打开成功");
    }
}

好 下面开始讲解一下 这个 创建数据库 跟 创建表的内容

我们可以看到 创建表 中 有一段
@"create table if not exists t_user(id integer primary key)"
这样的内容 那么这句话是什么意思呢?

首先要拆分一下

create table if not exists  t_  这句话 是前缀 不用更改,我只知道需要这么写 至于为什么 不好意思 我也不懂
t_user是表名,表示user表,table的缩写
(id integer primary key)  id是integer类型,primary key表示是主键

这里 我把 创建表代码跟创建表的打印信息 标记出来

 //创建表
//这里传的参数 就是 我们需要存储数据的model参数
    BOOL createTable = [manager createTableWithDic:@[@"cid",@"cname",@"cmap",@"cphone",@"ctime",@"conemonery",@"callmonery",@"cnumber",@"cway",@"cwaymonery",@"cother",@"cover"]];
    if (createTable) {
        NSLog(@"创建表成功");
    }
//打印结果
 create table if not exists t_user(id integer primary key,cid varchar,cname varchar,cmap varchar,cphone varchar,ctime varchar,conemonery varchar,callmonery varchar,cnumber varchar,cway varchar,cwaymonery varchar,cother varchar,cover varchar)

到这里 基本上创建表就结束了 当你创建成功的时候 就会打印出 创建表成功 的字样

下面开始讲解 增删改查的应用

1.增加
//插入一个model
- (BOOL)insertWithModel:(sellModel *)model{
    
    BOOL isBe = [self selectDataWithId:[model.cid intValue]];
    if (isBe) {
        [tishiXiaoShiViewController showMessage:@"ID已存在,重新像一个"];
        return [self updateDataWithModel:model]; //更新数据
    } else {
        NSString * insertSql = [NSString stringWithFormat:@"insert into t_user(cid,cname,cmap,cphone,ctime,conemonery,callmonery,cnumber,cway,cwaymonery,cother,cover)  values('%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@') ;", model.cid, model.cname, model.cmap,model.cphone,model.ctime,model.cOneMonery,model.cAllMonery,model.cNumber,model.cway,model.cwayMondery,model.cother,model.cover];
        return [dateBase executeUpdate:insertSql];
    }
}

这里 的代码就比较简单了 基本上没有什么大家不懂的

SQL语句中再次标记一点 t_user 这个字段 一定 不能更改

2。删除
//删除表
- (BOOL)deleteDataBase{
    NSString * delete=@"delete from t_user";
    return [dateBase executeUpdate:delete];
}
//删除一条记录
- (BOOL)deleteDataBaseWithModel:(sellModel *)model{
    NSString * delete = [NSString stringWithFormat:@"delete from t_user where cid = '%@'",model.cid];
    return [dateBase executeUpdate:delete];
}

这里就比较简单 一条是删除表【也就是删除全部】
一条是单独删除 【这里 我是根据 model中的cid 字段 查找数据并且删除 如果你没有id 那就跟觉别的字段是一样的 】
不管用什么 这里需要注意的一点就是 SQL语句中

t_user where cid 这句话中的cid 需要 根据各自需求去更改 可以是id 可以是name 可以是age 可以是你定义的一切字段 只要 你的表中包含这个字段就行

3.查询
//查询所有的
- (NSArray *)selectAllModels{
    NSMutableArray *results = [NSMutableArray array];
    NSString * sql = @"select * from t_user";
    FMResultSet *result = [dateBase executeQuery:sql];
    while(result.next){
        sellModel *model = [self selectDataWithResult:result];
        [results addObject:model];
    }
    return results;
}
//查询一条记录
- (sellModel *)selectDataWithId:(int)id{
    NSString * sql = [NSString stringWithFormat:@"select * from t_user where cid = '%d'",id];
    FMResultSet *result = [dateBase executeQuery:sql];
    sellModel *model;
    if ([result next]) {
        model = [self selectDataWithResult:result];
    }
    return model;
}

查询语句中 也比较简单 复制代码即可

这两条分别是
查询表中所有数据
查询单条数据
这里需要及时一下的 依旧是SQL语句
select * from t_user where cid = '%d'",id
这句话 这个id 在传进来之前 已经经过处理 所以 不在是String
【为了model统一 防止出现类型错误导致的一些不必要问题 所以我吧所有属性全部设置成String】;

这里还有一种查询方法是 条件筛选 上面那种筛选方式 是根据id查询 如果想根据别的字段查询 那么久需要用到条件筛选

- (NSArray *)queryData:(NSString *)querySql
{
    if (querySql == nil) {
        querySql = @"SELECT * FROM t_modals;";
    }
    
    NSMutableArray *arrM = [NSMutableArray array];
    FMResultSet *result = [dateBase executeQuery:querySql];
    
    while ([result next]) {
        sellModel *model = [[sellModel alloc]init];
        int ids = [result intForColumn:@"cid"];
        NSString *name = [result stringForColumn:@"cname"];
        NSString *map = [result stringForColumn:@"cmap"];
        NSString *cphone = [result stringForColumn:@"cphone"];
        NSString *ctime = [result stringForColumn:@"ctime"];
        NSString *conemonery = [result stringForColumn:@"conemonery"];
        NSString *callmonery = [result stringForColumn:@"callmonery"];
        NSString *cnumber = [result stringForColumn:@"cnumber"];
        NSString *cway = [result stringForColumn:@"cway"];
        NSString *cwaymonery = [result stringForColumn:@"cwaymonery"];
        NSString *cother = [result stringForColumn:@"cother"];
        NSString *cover = [result stringForColumn:@"cover"];
        model.cid = [NSString stringWithFormat:@"%d",ids];
        model.cname = name;
        model.cmap = map;
        model.cphone = cphone;
        model.ctime = ctime;
        model.cOneMonery = conemonery;
        model.cAllMonery = callmonery;
        model.cNumber = cnumber;
        model.cway = cway;
        model.cwayMondery = cwaymonery;
        model.cother = cother;
        model.cover = cover;

        [arrM addObject:model];
    }
    return arrM;
}

在这个语句中 querySql 就是筛选条件

使用方法

NSString * tiaojian = @"我是筛选条件";
NSString * shaixuan = @"我是筛选内容";
NSString *fuzzyQuerySql = [NSString stringWithFormat:@"SELECT * FROM t_user WHERE %@ LIKE '%%%@%%'",tiaojian,shaixuan];
        searcharray = [manager queryData:fuzzyQuerySql];

在使用的时候 需要 确认的是
t_user WHERE %@ LIKE
至于为什么 有 %%%@%%' 这样的符号? 是因为 筛选条件 可能会是中文 虽然我不明白代表什么意思 但是写上肯定没错就对了!

4.修改
- (BOOL)modifyData:(sellModel *)model
{
     NSString *update = [NSString stringWithFormat:@"update t_user set cid = '%@', cname = '%@',cmap = '%@',cphone = '%@',ctime = '%@',conemonery = '%@',callmonery = '%@',cnumber = '%@',cway = '%@',cwaymonery = '%@',cother = '%@',cover = '%@' WHERE cid = '%@'",model.cid,model.cname, model.cmap,model.cphone,model.ctime,model.cOneMonery,model.cAllMonery,model.cNumber,model.cway,model.cwayMondery,model.cother,model.cover, model.cid];
    return [dateBase executeUpdate:update];
}

关于这个修改呢 只需要把对应model传进来 就好了

这里面我依旧是根据cid 进行判断的

细心的朋友可能会发现 我在sql语句中 多了一个 WHERE cid = '%@'
没错 这就是 判断信息
也就是说 本次修改 需要根据 什么条件 去查找表中对应的信息并且修改


好了 到这里 基本上 我们已经 简单的讲解完了 FMDB 的基本使用方法 可能有些同学还是很懵逼啊

那继续往下看! 下面附上 代码~

//

#import <Foundation/Foundation.h>
@class sellModel;
@interface FMDBForSell : NSObject

//创建数据库
- (BOOL)createDataBaseWithName:(NSString *)name;
//创建表
- (BOOL)createTableWithDic:(NSArray *)arr;
//插入一个model
- (BOOL)insertWithModel:(sellModel *)model;
//删除表
- (BOOL)deleteDataBase;
//删除一条记录
- (BOOL)deleteDataBaseWithModel:(sellModel *)model;
//查询所有的
- (NSArray *)selectAllModels;
//查询一条记录
- (sellModel *)selectDataWithId:(int)id;

//修改数据
- (BOOL)updateDataWithModel:(sellModel *)model;

/** 修改数据 */
- (BOOL)modifyData:(sellModel *)model;

//筛选查看
- (NSArray *)queryData:(NSString *)querySql;

@end
//
//  FMDBForSell.m
//  zhanzhan
//
//  Created by 辛书亮 on 2017/1/19.
//  Copyright © 2017年 孟小猫. All rights reserved.
//

#import "FMDBForSell.h"
#import "FMDB.h"
#import "sellModel.h"
#import "tishiXiaoShiViewController.h"
@interface FMDBForSell ()
{
     FMDatabase *dateBase;
}
@end
@implementation FMDBForSell

//创建数据库
- (BOOL)createDataBaseWithName:(NSString *)name{
    //创建数据库
    NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    dateBase = [FMDatabase databaseWithPath:[path stringByAppendingString:[NSString stringWithFormat:@"/%@",name]]];
    return [dateBase open];
}
//创建表
- (BOOL)createTableWithDic:(NSArray *)arr{
    NSMutableString *creat = [NSMutableString stringWithString:@"create table if not exists t_user(id integer primary key)"];
    for (NSString *per in arr) {
        [creat insertString:[NSString stringWithFormat:@",%@ varchar", per] atIndex:creat.length-1];
    }
    return [dateBase executeUpdate:creat];
}

//插入一个model
- (BOOL)insertWithModel:(sellModel *)model{
    
    BOOL isBe = [self selectDataWithId:[model.cid intValue]];
    if (isBe) {
        [tishiXiaoShiViewController showMessage:@"ID已存在,重新像一个"];
        return [self updateDataWithModel:model];
    } else {
        NSString * insertSql = [NSString stringWithFormat:@"insert into t_user(cid,cname,cmap,cphone,ctime,conemonery,callmonery,cnumber,cway,cwaymonery,cother,cover)  values('%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@') ;", model.cid, model.cname, model.cmap,model.cphone,model.ctime,model.cOneMonery,model.cAllMonery,model.cNumber,model.cway,model.cwayMondery,model.cother,model.cover];
//                NSString * insertSql = [NSString stringWithFormat:@"insert into t_user(id,name,sex) values('%@','%@','%@')", model.id, model.name, model.sex];
        return [dateBase executeUpdate:insertSql];
    }
}
//更新数据
- (BOOL)updateDataWithModel:(sellModel *)model{

    NSString *update = [NSString stringWithFormat:@"update t_user set cid = '%@',cname = '%@',cmap = '%@',cphone = '%@',ctime = '%@',conemonery = '%@',callmonery = '%@',cnumber = '%@',cway = '%@',cwaymonery = '%@',cother = '%@',cover = '%@'", model.cid, model.cname, model.cmap,model.cphone,model.ctime,model.cOneMonery,model.cAllMonery,model.cNumber,model.cway,model.cwayMondery,model.cother,model.cover];
    return [dateBase executeUpdate:update];
}
- (BOOL)modifyData:(sellModel *)model
{
     NSString *update = [NSString stringWithFormat:@"update t_user set cid = '%@', cname = '%@',cmap = '%@',cphone = '%@',ctime = '%@',conemonery = '%@',callmonery = '%@',cnumber = '%@',cway = '%@',cwaymonery = '%@',cother = '%@',cover = '%@' WHERE cid = '%@'",model.cid,model.cname, model.cmap,model.cphone,model.ctime,model.cOneMonery,model.cAllMonery,model.cNumber,model.cway,model.cwayMondery,model.cother,model.cover, model.cid];
    return [dateBase executeUpdate:update];
}
//删除表
- (BOOL)deleteDataBase{
    NSString * delete=@"delete from t_user";
    return [dateBase executeUpdate:delete];
}
//删除一条记录
- (BOOL)deleteDataBaseWithModel:(sellModel *)model{
    NSString * delete = [NSString stringWithFormat:@"delete from t_user where cid = '%@'",model.cid];
    return [dateBase executeUpdate:delete];
}
//查询所有的
- (NSArray *)selectAllModels{
    NSMutableArray *results = [NSMutableArray array];
    NSString * sql = @"select * from t_user";
    FMResultSet *result = [dateBase executeQuery:sql];
    while(result.next){
        sellModel *model = [self selectDataWithResult:result];
        [results addObject:model];
    }
    return results;
}
//查询一条记录
- (sellModel *)selectDataWithId:(int)id{
    NSString * sql = [NSString stringWithFormat:@"select * from t_user where cid = '%d'",id];
    FMResultSet *result = [dateBase executeQuery:sql];
    sellModel *model;
    if ([result next]) {
        model = [self selectDataWithResult:result];
    }
    return model;
}
- (NSArray *)queryData:(NSString *)querySql
{
    if (querySql == nil) {
        querySql = @"SELECT * FROM t_modals;";
    }
    
    NSMutableArray *arrM = [NSMutableArray array];
    FMResultSet *result = [dateBase executeQuery:querySql];
    
    while ([result next]) {
        sellModel *model = [[sellModel alloc]init];
        int ids = [result intForColumn:@"cid"];
        NSString *name = [result stringForColumn:@"cname"];
        NSString *map = [result stringForColumn:@"cmap"];
        NSString *cphone = [result stringForColumn:@"cphone"];
        NSString *ctime = [result stringForColumn:@"ctime"];
        NSString *conemonery = [result stringForColumn:@"conemonery"];
        NSString *callmonery = [result stringForColumn:@"callmonery"];
        NSString *cnumber = [result stringForColumn:@"cnumber"];
        NSString *cway = [result stringForColumn:@"cway"];
        NSString *cwaymonery = [result stringForColumn:@"cwaymonery"];
        NSString *cother = [result stringForColumn:@"cother"];
        NSString *cover = [result stringForColumn:@"cover"];
        model.cid = [NSString stringWithFormat:@"%d",ids];
        model.cname = name;
        model.cmap = map;
        model.cphone = cphone;
        model.ctime = ctime;
        model.cOneMonery = conemonery;
        model.cAllMonery = callmonery;
        model.cNumber = cnumber;
        model.cway = cway;
        model.cwayMondery = cwaymonery;
        model.cother = cother;
        model.cover = cover;

        [arrM addObject:model];
    }
    return arrM;
}
- (sellModel *)selectDataWithResult:(FMResultSet *)result{
    sellModel *model = [[sellModel alloc] init];
    int ids = [result intForColumn:@"cid"];
    NSString *name = [result stringForColumn:@"cname"];
    NSString *map = [result stringForColumn:@"cmap"];
    NSString *cphone = [result stringForColumn:@"cphone"];
    NSString *ctime = [result stringForColumn:@"ctime"];
    NSString *conemonery = [result stringForColumn:@"conemonery"];
    NSString *callmonery = [result stringForColumn:@"callmonery"];
    NSString *cnumber = [result stringForColumn:@"cnumber"];
    NSString *cway = [result stringForColumn:@"cway"];
    NSString *cwaymonery = [result stringForColumn:@"cwaymonery"];
    NSString *cother = [result stringForColumn:@"cother"];
    NSString *cover = [result stringForColumn:@"cover"];
    model.cid = [NSString stringWithFormat:@"%d",ids];
    model.cname = name;
    model.cmap = map;
    model.cphone = cphone;
    model.ctime = ctime;
    model.cOneMonery = conemonery;
    model.cAllMonery = callmonery;
    model.cNumber = cnumber;
    model.cway = cway;
    model.cwayMondery = cwaymonery;
    model.cother = cother;
    model.cover = cover;
    return model;
}

@end



使用代码

-(void)viewDidLoad
{
    manager = [[FMDBForSell alloc] init];
    
    //创建数据库
    BOOL open = [manager createDataBaseWithName:@“111.sqlist”];
    //打开数据库
    if (open) {
        NSLog(@"数据库打开成功");
    }
    
//    [manager deleteDataBase];
    [self.updataArray removeAllObjects];
    NSArray *arr = [manager selectAllModels];
    for (int i = 0 ; i < arr.count; i ++) {
        sellModel *model = [[sellModel alloc]init];
        model = arr[i];
        [self.updataArray addObject:model];
    }
    [self.GatoTableview reloadData];
    
}

下面贴上 app演示

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

推荐阅读更多精彩内容