iOS-FMDB

作者: 麦穗0615 | 来源:发表于2016-07-03 21:34 被阅读2290次
前言:

今天,就让我们,重点学习一下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

相关文章

  • iOS-FMDB

    前言: 今天,就让我们,重点学习一下FMDB。 FMDB学习 一、基本介绍 简介:-由于iOS中原生的 SQLit...

  • IOS-FMDB使用

    基类 FMDatabase:是一个提供 SQLite 数据库的类,用于执行 SQL 语句。 FMResultSet...

  • iOS-FMDB 基础用法

    github链接地址 https://github.com/ccgus/fmdb文顶http://www.cnbl...

  • iOS-FMDB详解及使用

    一 FMDB简介 什么是 FMDB FMDB 是 iOS 平台的 SQLite 数据库框架 FMDB 以 OC 的...

  • ios-FMDB 添加字段,添加自增长

    需求: 需要在数据中添加字段,设置字段自增长 实现方式: 1、判断表中是否存在改字段,如果不存在则添加 2、在sq...

  • iOS-FMDB缓存自定义对象

    前言 最近刚做完一个列表页的数据缓存,我同时探讨FMDB和CoreData两种做法,下面先说下FMDB的过程。 过...

  • iOS-FMDB改进方案YIIFMDB:直接操作Model,纯面

    我在写UDUserDefaultsModel(文章链接,github)这个库时曾经立下一个flag:要写一个基于m...

  • iOS-FMDB数据库之增删改查使用

    FMDB是一个轻量级的数据库,用于将网络资源存储在本地。FMDB 将 SQLite API 进行了很友好的封装,使...

  • iOS-FMDB本地存储之一种封装思想

    前言 家里养的是哈士奇,它小的时候,我总喜欢抱着它睡.后来长大了,发现床越来越挤了,就不让他上床了,这货叫的比杀猪...

网友评论

    本文标题:iOS-FMDB

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