FMDB入门使用

本文介绍如何使用FMDB简化iOS开发中的SQLite数据库操作,包括数据库的增删查改,并展示了一个包含图片存储的具体示例。

在存取数据的时候用数据库的话会很方便,但是ios开发的过程中不像java开发那样的直接写数据路的操作语句

这里我们就借助及三房框架FMDB让ios开发过程中的数据库的操作想java开发中一样的方便

下边仅仅对数据库的CRUD做了简单地实例

FMDB还有一个很优秀的地方

就是可以自动的回滚

我在更新数据库的地方进行了简单的应用

/*
    设计数据库-> t_person
    设计表的字段 -> name,money
    创建数据库文件->FMDB
 
 */

#import "ViewController.h"
#import "FMDB.h"

@interface ViewController ()

@property (nonatomic, strong) FMDatabaseQueue *queue;

@end

@implementation ViewController

// 增加
- (IBAction)insert:(id)sender {
//    NSString *sql = [NSString stringWithFormat:@"insert into t_person (name,money) values('%@',%d)",@"wanglaowu",1000];
    // ? 数据库的占位符
    // executeUpdate方法里面的参数必须添对象
    
    [_queue inDatabase:^(FMDatabase *db) {
        
        BOOL success = [db executeUpdate:@"insert into t_person (name,money) values(?,?)",@"a",@1000];
        if (success) {
            NSLog(@"插入成功");
        }else{
            NSLog(@"插入失败");
        }
        
        
        BOOL success1 = [db executeUpdate:@"insert into t_person (name,money) values(?,?)",@"b",@1500];
        if (success1) {
            NSLog(@"插入成功");
        }else{
            NSLog(@"插入失败");
        }
    }];
    
}
- (IBAction)delete:(id)sender {
    [_queue inDatabase:^(FMDatabase *db) {
        NSString *sql = [NSString stringWithFormat:@"delete from t_person"];
        BOOL success = [db executeUpdate:sql];
        if (success) {
            NSLog(@"删除成功");
        }else{
            NSLog(@"删除失败");
        }

    }];
}

- (IBAction)select:(id)sender {

    [_queue inDatabase:^(FMDatabase *db) {
        
        FMResultSet *set = [db executeQuery:@"select * from t_person"];
        
        while ([set next]) {
            
            // 查询到一条记录
            NSString *name = [set stringForColumn:@"name"];
            int money = [set intForColumn:@"money"];
            NSLog(@"name = %@-money=%d",name,money);
        }
    }];
    
    
}
- (IBAction)update:(id)sender {
    
    [_queue inDatabase:^(FMDatabase *db) {
        
        // 开启事务
        [db beginTransaction];
        
        
        NSString *sql = [NSString stringWithFormat:@"update t_person set money = 500 where name = 'a'"];
        BOOL success = [db executeUpdate:sql];
        if (success) {
            NSLog(@"更新成功");
        }else{
            NSLog(@"更新失败");
            // 回滚:前面的操作全部无效,只要是一个事务上的操作.
            [db rollback];
        }
        /**
         *  错误的示范
         */
        NSString *sql1 = [NSString stringWithFormat:@"update1 t_person set money = 2000 where name = 'b'"];
        BOOL success1 = [db executeUpdate:sql1];
        if (success1) {
            NSLog(@"更新成功");
        }else{
            // 回滚:前面的操作全部无效,只要是一个事务上的操作.
            [db rollback];
            NSLog(@"更新失败");
        }
        
        // 提交
        [db commit];
    }];
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *filePath = [docPath stringByAppendingPathComponent:@"person.sqlite"];
    
    // 1.创建数据库的队列,会自动帮你创建FMDatabase对象,打开数据库,肯定会生成数据库实例还有生成数据库文件
    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filePath];
    _queue = queue;
    //FMDatabase *db 是多线程安全的
    [queue inDatabase:^(FMDatabase *db) {
        // 创建表格
        // executeUpdate除了查询操作,其他都是属于更新,创建表格,增删改
        BOOL success =  [db executeUpdate:@"create table if not exists t_person (id integer primary key,name text not null,money integer not null);"];
        if (success) {
            NSLog(@"创建成功");
        }else{
            NSLog(@"创建失败");
        }

        
    }];
    
  
    
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
一些更好用的例子
//
//  ViewController.m
//  FMDBTest
//
//  Created by 杨小兵 on 15/7/31.
//  Copyright (c) 2015年 杨小兵. All rights reserved.
//

#import "ViewController.h"
#import "FMDB.h"
@import AssetsLibrary;
@import AVFoundation;

@interface ViewController ()<UIImagePickerControllerDelegate , UINavigationControllerDelegate>

@property(nonatomic , strong)UIImage *image;
@property (nonatomic, strong) FMDatabaseQueue *queue;
@property (weak, nonatomic) IBOutlet UITextField *IDTextField;
@property (weak, nonatomic) IBOutlet UITextField *nameTextField;
@property (weak, nonatomic) IBOutlet UIButton *iconButton;
- (IBAction)iconButtonClick:(UIButton *)sender;

@end

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self creatDataBase];
}
// 增加
- (IBAction)insert:(id)sender
{
    // executeUpdate方法里面的参数必须添对象
    
    [_queue inDatabase:^(FMDatabase *db) {
        [db open];
        BOOL success = [db executeUpdate:@"insert into FMDBTest (name,imageData) values(?,?)",self.nameTextField.text,UIImagePNGRepresentation(self.image)];
        if (success)
        {
            NSLog(@"插入成功");
        }
        else
        {
            NSLog(@"插入失败");
        }
        [db close];
    }];
}
- (IBAction)delete:(id)sender
{
    [_queue inDatabase:^(FMDatabase *db) {
        [db open];
        BOOL success = [db executeUpdate:@"delete from FMDBTest where id = ?",self.IDTextField.text];
        if (success)
        {
            NSLog(@"删除成功");
        }
        else
        {
            NSLog(@"删除失败");
        }
        
        [db close];
    }];
}

- (IBAction)select:(id)sender
{
    
    [_queue inDatabase:^(FMDatabase *db) {
        [db open];
        FMResultSet *set = [db executeQuery:@"select * from FMDBTest where id = ?",self.IDTextField.text];
        
        if ([set next])
        {
            // 查询到一条记录
            
            NSInteger ID = [set intForColumn:@"id"];
            NSString *name = [set stringForColumn:@"name"];
            NSData *data = [set dataForColumn:@"imageData"];
            self.IDTextField.text = [NSString stringWithFormat:@"%@",@(ID)];
            self.nameTextField.text = name;
            [self.iconButton setImage:[UIImage imageWithData:data] forState:UIControlStateNormal];
        }
        else
        {
            NSLog(@"没有查询到内容");
        }
        [db close];
    }];
    
}
- (IBAction)update:(id)sender
{
    
    [_queue inDatabase:^(FMDatabase *db) {
        
        [db open];
        // 开启事务
        [db beginTransaction];
        BOOL success = [db executeUpdate:@"update FMDBTest set name = ? , imageData = ? where id = ?",self.nameTextField.text,UIImagePNGRepresentation(self.image),self.IDTextField.text];;
        if (success) {
            NSLog(@"更新成功");
        }else{
            NSLog(@"更新失败");
            // 回滚:前面的操作全部无效,只要是一个事务上的操作.
            [db rollback];
        }
        // 提交
        [db commit];
        [db close];
    }];
    
}
- (void)creatDataBase
{
    NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *filePath = [docPath stringByAppendingPathComponent:@"FMDBTest.sqlite"];
    
    // 1.创建数据库的队列,会自动帮你创建FMDatabase对象,打开数据库,肯定会生成数据库实例还有生成数据库文件
    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filePath];
    _queue = queue;
    //FMDatabase *db 是多线程安全的
    [queue inDatabase:^(FMDatabase *db) {
        // 创建表格
        // executeUpdate除了查询操作,其他都是属于更新,创建表格,增删改
        BOOL success =  [db executeUpdate:@"create table if not exists FMDBTest (id integer primary key,name text not null , imageData blob not null);"];
        if (success)
        {
            NSLog(@"创建成功");
        }
        else
        {
            NSLog(@"创建失败");
        }
        [db close];
    }];
}

- (IBAction)iconButtonClick:(UIButton *)sender
{
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    imagePicker.delegate = self;
    imagePicker.allowsEditing = YES;
    [self presentViewController:imagePicker animated:YES completion:nil];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    self.image = info[@"UIImagePickerControllerEditedImage"];
    [picker dismissViewControllerAnimated:YES completion:^{
        [self.iconButton setImage:self.image forState:UIControlStateNormal];
    }];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [picker dismissViewControllerAnimated:YES completion:nil];
}

- (UIImage *)image
{
    if (_image == nil)
    {
        _image = [UIImage imageNamed:@"icon"];
    }
    return _image;
}
@end
 
例子的giehub地址   https://github.com/sixTiger/FMDBTest/tree/master

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值