FMDB的简单使用

1.FMDB简单介绍

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便。于是,就出现了一系列将SQLite API进行封装的库FMDB (https://github.com/ccgus/fmdb) 是一款简洁、易用的封装库

FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。

FMDB常用类:
FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。
FMResultSet :执行查询一个FMDatabase结果集。 FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类。
创建数据库:
db = [FMDatabase databaseWithPath:database_path];

● FMDB优点:

1.使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
2.对比苹果自带的CoreData框架,更加轻量级和灵活
3.提供多线程安全,有效地防止数据混乱,原来的SQLite不是线程安全的

● FMDB缺点:
因为是OC语言封装的,失去了SQLite原来的跨平台性(相对于其他语言)

2.效果图

Untitled2.gif

3.注意点

1.使用cocoapods
或者去下载FMDBsdk拖进工程中
2.须导入libsqlite3.0.tbd依赖库

4.代码展示

1.创建模型用于接受数据

import "model.h"

.h

//分类
@property(nonatomic,strong) NSString *classify;
//书名
@property(nonatomic,strong) NSString *bookName;
//价格
@property(nonatomic,strong) NSString *bookPrice;
//作者
@property(nonatomic,strong) NSString *bookAuthor;
//备注
@property(nonatomic,strong) NSString *remark;
//id
@property(nonatomic,assign) NSInteger bookID;

2.创建业务处理层用于处理数据
.h

#import "FMDatabase.h"
#import "model.h"

@interface loadData : NSObject
//单例
+(instancetype)shareLoadData;
//添加
-(void)addBook:(model *)mode;
//查询
-(NSMutableArray *)marr;
//修改
-(void)changeBook:(model *)model;
//删除
-(void)deleteBook:(model *)model;

.m

#import "loadData.h"
static loadData *ld =nil;
static FMDatabase *fate;
@implementation loadData
//单例
+(instancetype)shareLoadData
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        ld = [[loadData alloc]init];
        [ld initA];
    });
    return ld;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    if (!ld) {
        ld = [super allocWithZone:zone];
    }
    return ld;
}
-(id)copy
{
    return self;
}
-(id)mutableCopy
{
    return self;
}
//初始化数据库
-(void)initA{
    //创建沙盒
    NSString *Ste = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
    //定义文件名
    NSString *path = [Ste stringByAppendingPathComponent:@"HousingInfo.sqlite"];
    //初始化
    fate = [[FMDatabase alloc]initWithPath:path];
    //判断
    if ([fate open]) {
        //初始化
        [fate executeUpdate:@"create table class (bookID integer primary key, classify text, bookName text , bookPrice text , bookAuthor text , remark text)"];
        [fate close];
        NSLog(@"成功");
    }else{
        NSLog(@"失败");
    }
}
//添加
-(void)addBook:(model *)mode
{

    
    BOOL isc = false;
    NSArray *arr = [self marr];
    for (model *m in arr) {
        if ([m.classify isEqualToString:mode.classify] && [m.bookName isEqualToString:mode.bookName]&&[m.bookPrice isEqualToString:mode.bookPrice]&&[m.bookAuthor isEqualToString:mode.bookAuthor]&&[m.remark isEqualToString:mode.remark]) {
            isc = true;
        }
    }
    if (isc) {
        NSLog(@"数据相同");
    }else{
        [fate open];
        BOOL isb = [fate executeUpdate:[NSString stringWithFormat:@"insert into class values (null , '%@','%@','%@','%@','%@')",mode.classify,mode.bookName,mode.bookPrice,mode.bookAuthor,mode.remark]];
        if (isb) {
            NSLog(@"添加成功");
        }else{
            NSLog(@"添加失败");
        }
        [fate close];
}
//查询
-(NSMutableArray *)marr
{
    //初始化
    NSMutableArray *marr = [NSMutableArray new];
    //开始
    [fate open];
    //初始化
    FMResultSet *Set = [[FMResultSet alloc]init];
    //使用set接受
    Set = [fate executeQuery:@"select *from class"];
    //判断
    while ([Set next]) {
        //初始化
        model *mm = [model new];
        //链接
        mm.classify = [Set stringForColumn:@"classify"];
        mm.bookName = [Set stringForColumn:@"bookName"];
        mm.bookPrice = [Set stringForColumn:@"bookPrice"];
        mm.bookAuthor = [Set stringForColumn:@"bookAuthor"];
        mm.remark = [Set stringForColumn:@"remark"];
        mm.bookID = [Set intForColumn:@"bookID"];
        //添加到数组
        [marr addObject:mm];
        
    }
    //关闭
    [fate close];
    //返回值
    return marr;
}
//修改
-(void)changeBook:(model *)model
{
    //开始
    [fate open];
    //初始化
    NSString *str = [NSString stringWithFormat:@"update class set classify = '%@',bookName = '%@',bookPrice = '%@',bookAuthor = '%@',remark = '%@' where bookID = '%ld'",model.classify,model.bookName,model.bookPrice,model.bookAuthor,model.remark,model.bookID];
    //BOOL值接受
    BOOL ii = [fate executeUpdate:str];
    //判断
    if (ii) {
        NSLog(@"成功");
    }else{
        NSLog(@"失败");
    }
    //关闭
    [fate close];
}
//删除
-(void)deleteBook:(model *)model
{
    //开始
    [fate open];
    //初始化
    NSString *str = [NSString stringWithFormat:@"delete from class where bookID = '%ld' ",model.bookID];
    //BOOL值接受
    BOOL ii = [fate executeUpdate:str];
    //判断
    if (ii) {
        NSLog(@"成功");
    }else{
        NSLog(@"失败");
    }
    //关闭
    [fate close];
}
@end

3.数据进行展示

//将要显示
-(void)viewWillAppear:(BOOL)animated{
    //查询
    Marr = [[loadData shareLoadData]marr];
    //刷新
    [tabele reloadData ];//这个是展示在表格中的
}

4.数据添加页面

#import "model.h"
#import "loadData.h"
@interface addViewController ()
@property (weak, nonatomic) IBOutlet UITextField *classiftyTF;
@property (weak, nonatomic) IBOutlet UITextField *bookNameTF;
@property (weak, nonatomic) IBOutlet UITextField *bookAuthorTF;
@property (weak, nonatomic) IBOutlet UITextField *bookpriceTF;
@property (weak, nonatomic) IBOutlet UITextField *remarkTF;

@end

@implementation addViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}
- (IBAction)add:(id)sender {
    //初始化
    model *mm = [model new];
    //链接
    mm.classify =self.classiftyTF.text;
    mm.bookName =self.bookNameTF.text;
    mm.bookPrice =self.bookpriceTF.text;
    mm.bookAuthor =self.bookpriceTF.text;
    mm.remark =self.remarkTF.text;
    
    //添加到数据库
    [[loadData shareLoadData]addBook:mm];
    //跳转
    [self.navigationController popViewControllerAnimated:YES];
}

5.数据修改界面

从原界面到修改界面有一步传值操作(属性传值)
#import "model.h"
#import "loadData.h"
@interface changeViewController ()
@property (weak, nonatomic) IBOutlet UITextField *classityTF;
@property (weak, nonatomic) IBOutlet UITextField *bookAuthorTF;
@property (weak, nonatomic) IBOutlet UITextField *bookPriceTF;
@property (weak, nonatomic) IBOutlet UITextField *bookNameTF;
@property (weak, nonatomic) IBOutlet UITextField *remarkTF;

@end

@implementation changeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    //将数据添加到修改页面
    self.classityTF.text =self.mm.classify;
    self.bookNameTF.text =self.mm.bookName;
    self.bookPriceTF.text =self.mm.bookPrice;
    self.bookAuthorTF.text =self.mm.bookAuthor;
    self.remarkTF.text =self.mm.remark;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)change:(id)sender {
    //初始化
    model *mm = self.mm;
    //链接
    mm.classify = self.classityTF.text;
    mm.bookName = self.bookNameTF.text;
    mm.bookPrice = self.bookPriceTF.text;
    mm.bookAuthor = self.bookAuthorTF.text;
    mm.remark = self.remarkTF.text;
    //添加
    [[loadData shareLoadData]changeBook:mm];
    //跳转
    [self.navigationController popViewControllerAnimated:YES];
}

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

推荐阅读更多精彩内容

  • 一、FMDB基本使用 1、什么是FMDB? FMDB是一款简洁、易用的封装库。因此,在这里推荐使用第三方框架FMD...
    豆宝的老公阅读 10,239评论 1 14
  • 这篇文章没有提到coredata, 如果想了解coredata的小伙伴就不要在这浪费时间啦~ 我们常用到的存储本地...
    饭后的甜点_阅读 932评论 0 0
  • 前言 以前使用SQLite十分的麻烦,代码很冗余,所以开发者朋友们一般在实际开发的过程中都是使用的是FMDB这个开...
    Alexander阅读 1,296评论 6 16
  • FMDB (https://github.com/ccgus/fmdb) 是一款简洁、易用的封装库,这一篇文章简单...
    怪兽密保阅读 172评论 0 0
  • 《百年孤独》和它的作者加西亚·马尔克斯早就成为一个流行国际的文化符号,成为现代人精神领域里的一块界碑。文科出身的...
    沙沫枝阅读 1,005评论 3 20