iOS-FMDB

前言:

今天,就让我们,重点学习一下FMDB。

FMDB学习
一、基本介绍
  • 简介:-由于iOS中原生的 SQLite API 使用时非常不方便 ,于是就出现了一系列将SQLite API 进行封装的库,例如FMDB、PlausibleDatabase、sqlitepersistentobjects等,FMDB是一款简洁易用、轻量级的封装库。
  • 什么是FMDB
    -- FMDB是iOS平台的SQLite数据库框架
    -- FMDB以OC的方式封装了SQLite的C语言API
  • 在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包。

    FMDB库
  • FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。
  • FMDB常用类:
     -- FMDatabase:一个FMDatabase对象就代表一个单独的SQLite数据库用来执行SQL语句
     -- FMResultSet:使用FMDatabase执行查询后的结果集
     -- FMDatabaseQueue:用于在多线程中执行多个查询或更新,它是线程安全的
  • FMDB的优点
    -- 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
    -- 对比苹果自带的Core Data框架,更加轻量级和灵活
    -- 提供了多线程安全的数据库操作方法,有效地防止数据混乱
  • FMDB的缺点
     -- 它本身也存在一些问题,比如跨平台,因为它是用oc的语言封装的,所以
       只能在ios开发的时候使用,如果想实现跨平台的操作,来降低开发的成本
       和维护的成本,就需要使用比较原始的SQLite。
    二、使用方法
  • 打开数据库
    通过指定SQLite数据库文件路径来创建FMDatabase对象
     FMDatabase *db = [FMDatabase databaseWithPath:path];
     if (![db open]) {NSLog(@"数据库打开失败!");}
    关于文件路径的三种情况:
      --1.具体的文件路径,或是数据库的文件不存在时,fmdb会自己创建一个。
      --2.若文件路径为空字符串@"",会在临时目录创建一个空的数据库。
     并且,当(FMDatabase)数据库断开连接时,数据库文件被删除。
      --3.若你传入的参数为NULL,则它会建立一个在内存中的数据库,数据库断开连接时,数据库文件被删除。
  • 执行更新:
    • 在FMDB中,除查询以外的所有操作,都称为“更新”如:create、drop、insert、update、delete等。
    • FMDB数据库操作使用 executeUpdate: 方法执行更新,返回BOOL型。
  • ** executeUpdate:用法
    - (BOOL)executeUpdate:(NSString*)sql, ...
    - (BOOL)executeUpdateWithFormat:(NSString*)format, ... 
    - (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments 
    示例 
    [db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]
  • 执行查询
  • ** 查询方法
      查询方法
       - (FMResultSet *)executeQuery:   (NSString*)sql, ...
       - (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
       - (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
    示例
     // 查询数据
      FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];
     // 遍历结果集
     while ([rs next]) { NSString *name = [rs stringForColumn:@"name"]; 
     int age = [rs intForColumn:@"age"];
     double score = [rs doubleForColumn:@"score"];}
    *FMDatabaseQueue
  • 注意:
    - FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个
      FMDatabase实例,会造成数据混乱等问题
    - 为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue
    - FMDatabaseQueue的创建
       FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
  • 简单使用
     简单使用
     [queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"]; 
     [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"]; 
     [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"]; 
     FMResultSet *rs = [db executeQuery:@"select * from t_student"]; 
     while ([rs next]) { 
         // … 
    }
     }];
  • 使用事务
    使用事务
    [queue inTransaction:^(FMDatabase *db, BOOL *rollback) { 
     [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"]; 
     [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"]; 
     [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"]; 
     FMResultSet *rs = [db executeQuery:@"select * from t_student"]; 
     while ([rs next]) { 
           // … 
      }
      }];
    三、示例代码
    //
    //  ViewController.m
    //  FMDB
    //
    //  Created by mac on 16/7/3.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    #import "ViewController.h"
    #import "FMDB.h"
    @interface ViewController ()
    @property(strong,nonatomic)FMDatabase *db;
    @end
    @implementation ViewController
    #pragma mark- 创建数据库
    - (void)viewDidLoad {
      [super viewDidLoad];
      // 1.获取数据库文件的路径
      NSString *doc =    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
      NSString *fileName = [doc stringByAppendingPathComponent:@"student.sqlite"];
      //  2.获取数据库
      FMDatabase *db = [FMDatabase databaseWithPath:fileName];
      //  3.打开数据库
      if([db open]){
      //4.创表
      BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
      if (result) {
          NSLog(@"创表成功");
      }else{
          NSLog(@"创表失败");
      }
    }
       self.db = db;
    }
    #pragma mark- 触发执行
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
     [self delete];
     [self insert];
     [self query]
    }
    #pragma mark- 插入数据
    - (void)insert
    {
      for (int i = 0; i<10; i++) {
      NSString *name = [NSString stringWithFormat:@"jack-%d",arc4random_uniform(100)];
      //  executeUpdate: 不确定的参数用?来占位
      [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);",name, @(arc4random_uniform(40))];
      //        [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);" withArgumentsInArray:@[name, @(arc4random_uniform(40))]];
      // executeUpdateWithFormat : 不确定的参数用%@、%d等来占位
      //        [self.db executeUpdateWithFormat:@"INSERT INTO t_student (name, age) VALUES (%@, %d);", name, arc4random_uniform(40)];
      } 
     }
     #pragma mark- 删除数据
    -(void)delete{
       //      [self.db executeUpdate:@"DELETE FROM t_student;"];
      [self.db executeUpdate:@"DROP TABLE IF EXISTS t_student;"];
      [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
      }
     #pragma mark- 查询数据
     - (void)query
    {
      // 1.执行查询语句
      FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM t_student"];
      // 2.遍历结果
     while ([resultSet next]) {
             int ID = [resultSet intForColumn:@"id"];
             NSString *name = [resultSet stringForColumn:@"name"];
             int age = [resultSet intForColumn:@"age"];
             NSLog(@"%d %@ %d", ID, name, age);
         }
     }
     @end
  • 提示:
       如果ID设置为逐渐,且设置为自动增长的话,那么把表中的数据删除后,重新插入新的数据,ID的编号不是
     从0开始,而是接着之前的ID进行编号。
  • 注意:
     不要写成下面的形式,不要加'',直接使用%@,它会自动认为这是一个字符串。

    错误展示

    学习网站:
    1.FMDB使用小结 
      http://blog.sina.com.cn/s/blog_1410870560102wyjo.html
    2.[数据库操作(使用FMDB)]
      (http://blog.csdn.net/xyz_lmn/article/details/9312837)
    3.FMDB使用
      (http://www.cnblogs.com/wuhenke/archive/2012/02/07/2341656.html)http://www.cnblogs.com/wuhenke/archive/2012/02/07/2341656.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FMDB的封装,使你的实体类具备数据库操作的功能,极大简化你的数据库操作,对于自己的扩展也非常简单。 该框架是本人在项目中用到的对FMDB的封装,它的特点如下: 1.自动创建数据库、自动创建数据库表。 2.自动检测字段添加新字段。 3.一行代码实现数据库的CURD操作。 4.源码及其简单,易于理解和掌握。 5.扩展自己的功能也非常得简单,容易。 6,只关心字段和字段值,完全不用关心数据库操作逻辑. 特别提示:字段值全部以字符串的形式统一处理 常用的api如下: /** 获取数据库单例函数 */ (instancetype)intance; /** 数据库中是否存在表 */ - (BOOL)isExistWithTableName:(NSString*)name; /** 默认建立主键id 创建表(如果存在则不创建) , keys 数据存放要求@[字段名称1,字段名称2] */ -(BOOL)createTableWithTableName:(NSString*)name keys:(NSArray*)keys; /** 插入 只关心key和value @{key:value,key:value} */ -(BOOL)insertIntoTableName:(NSString*)name Dict:(NSDictionary*)dict; /** 根据条件查询字段 返回的数组是字典( @[@{key:value},@{key:value}] ) ,where形式 @[@"key",@"=",@"value",@"key",@">=",@"value"] */ -(NSArray*)queryWithTableName:(NSString*)name keys:(NSArray*)keys where:(NSArray*)where; /** 全部查询 返回的数组是字典( @[@{key:value},@{key:value}] ) */ -(NSArray*)queryWithTableName:(NSString*)name; /** 根据key更新value 形式 @[@"key",@"=",@"value",@"key",@">=",@"value"] */ -(BOOL)updateWithTableName:(NSString*)name valueDict:(NSDictionary*)valueDict where:(NSArray*)where; /** 根据表名和表字段删除表内容 where形式 @[@"key",@"=",@"value",@"key",@">=",@"value"] */ -(BOOL)deleteWithTableName:(NSString*)name where:(NSArray*)where; /** 根据表名删除表格全部内容 */ -(BOOL)clearTable:(NSString*)name; /** 删除表 */ -(BOOL)dropTable:(NSString*)name;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值