专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构

FMDB使用

  • FMDB是iOS平台的SQLite数据库框架
  • FMDB以OC的方式封装了SQLite的C语言API

  • FMDB的优点

    • 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
    • 对比苹果自带的Core Data框架,更加轻量级和灵活
    • 提供了多线程安全的数据库操作方法,有效地防止数据混乱
  • 官网地址
  • CocoaPods 集成 FMDB
    pod 'FMDB'
    

核心类

  • FMDB核心类:
    • FMDatabase: 一个FMDatabase表示一个sqlite数据库.所有对数据库的操作都是通过这个类
      • executeStatements: 执行多条sql
      • executeQuery: 执行查询语句
      • executeUpdate: 执行除查询以外的语句,create, drop, insert, delete, update
    • FMDatabaseQueue: 内部封装FMDatabase和串行queue,用于多线程操作数据库,并且提供事务,建议使用这个
      • inDatabase: 参数是一个闭包,在闭包里面可以获得FMDatabase对象
      • inTransaction: 使用事务.
    • FMResultSet: 查询的结果集
      • 通过字段名称获取字段值

FMDB使用

  1. 建立SQLiteManager 单例对象

    1. SQLiteManager.h

       #import <Foundation/Foundation.h>
       #import <FMDB.h>
      
       @interface SQLiteManager : NSObject
      
       @property (nonatomic, strong) FMDatabaseQueue *dbQueue;
      
       // 单例
       + (instancetype)sharedManager;
      
       /**
        *  通过数据库名称打开数据库
        *  @param dbName 数据库名称
        */
       - (void)openDatabaseWithName:(NSString *)dbName;
       @end
      
    2. SQLiteManager.m

        #import "SQLiteManager.h"
      
        @implementation SQLiteManager
      
        #pragma mark - 单例
        static id _instance;
        + (instancetype)sharedManager {
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                _instance = [[self alloc] init];
            });
      
            return _instance;
        }
      
        + (instancetype)allocWithZone:(struct _NSZone *)zone {
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                _instance = [super allocWithZone:zone];
            });
      
            return _instance;
        }
      
        - (id)copyWithZone:(nullable NSZone *)zone {
            return _instance;
        }
        @end
      
  2. 打开数据库和创建表

    • SQLiteManager.m 添加如下代码

        /**
         *  通过数据库名称打开数据库
         *  @param dbName 数据库名称
         */
        - (void)openDatabaseWithName:(NSString *)dbName {
            NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
            NSLog(@"documentPath = %@", documentPath);
      
            // 拼接数据库路径
            NSString *dbPath = [documentPath stringByAppendingPathComponent:dbName];
      
            self.dbQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
            [self createTableWithTableName:@"T_Person"];
        }
      
        /**
         *  创建数据表
         *  @param tableName 表名称
         */
        - (void)createTableWithTableName:(NSString *)tableName {
            // 创建表sql
            NSString *createTableSql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, height REAL);", tableName];
      
            [self.dbQueue inDatabase:^(FMDatabase *db) {
                [db executeUpdate:createTableSql];
            }];
        }
      
  3. 使用 FMDB 增删改查

    1. FMDB 插入单条数据

       /**
        *  测试添加数据
        */
       - (void)testInsert {
           // 插入数据
           // sql语句内容确定
           NSString *sql = @"INSERT INTO T_Person (name, age, height) VALUES ('赵六66', 26, 1.70);";
           [[SQLiteManager sharedManager].dbQueue inDatabase:^(FMDatabase *db) {
               [db executeUpdate:sql];
           }];
      
           // sql语句内容不确定
           [[SQLiteManager sharedManager].dbQueue inDatabase:^(FMDatabase *db) {
               [db executeUpdateWithFormat: @"INSERT INTO T_Person (name, age, height) VALUES (%@, %d, %f);", @"冰冰26", 22, 1.65];
           }];
       }
      
    2. FMDB 修改数据

        /**
         *  测试修改数据
         */
        - (void)testUpdate {
            NSString *sql = @"UPDATE T_Person SET name = '刘德华' WHERE id = 2;";
      
            [[SQLiteManager sharedManager].dbQueue inDatabase:^(FMDatabase *db) {
                [db executeUpdate:sql];
            }];
        }
      
    3. FMDB 删除数据

        /**
         *  测试删除数据
         */
        - (void)testDelete {
            NSString *sql = @"DELETE FROM T_Person WHERE id = 4;";
      
            [[SQLiteManager sharedManager].dbQueue inDatabase:^(FMDatabase *db) {
                [db executeUpdate:sql];
            }];
        }
      
    4. FMDB 大批量添加数据

        /**
         *  测试大批量添加数据
         */
        - (void)testManyInsert {
            NSString *sql = @"INSERT INTO T_Person (name, age, height) VALUES (%@, %d, %f);";
            [[SQLiteManager sharedManager].dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
                CFTimeInterval start = CACurrentMediaTime();
      
                for (int i = 0; i < 100; i++) {
                    NSString *name = [NSString stringWithFormat:@"冰冰-%d", i];
                    [db executeUpdateWithFormat:sql, name, arc4random() % 40, 1.65];
                }
      
                CFTimeInterval end = CACurrentMediaTime();
                NSLog(@"消耗时间: %.04f s", end - start);
            }];
        }
      
    5. FMDB 事务回滚

        /**
         *  测试大批量添加数据
         */
        - (void)testManyInsert {
            NSString *sql = @"INSERT INTO T_Person (name, age, height) VALUES (%@, %d, %f);";
            [[SQLiteManager sharedManager].dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
                CFTimeInterval start = CACurrentMediaTime();
      
                for (int i = 0; i < 100; i++) {
                    NSString *name = [NSString stringWithFormat:@"冰冰-%d", i];
                    [db executeUpdateWithFormat:sql, name, arc4random() % 40, 1.65];
      
                    if (i == 50) {
                        NSLog(@"模拟批量添加数据失败");
                        // rollback设置为YES表示回滚
                        *rollback = YES;
                        break;
                    }
                }
      
                CFTimeInterval end = CACurrentMediaTime();
                NSLog(@"消耗时间: %.04f s", end - start);
            }];
        }
      
    6. FMDB 查询

        /**
         *  测试查询数据
         */
        - (void)testQuery {
            [[SQLiteManager sharedManager].dbQueue inDatabase:^(FMDatabase *db) {
                // 查询sql语句
                NSString *sql = @"SELECT id, name, age, height FROM T_Person LIMIT 30;";
      
                FMResultSet *resultSet = [db executeQuery:sql];
                while ([resultSet next]) {
                    int id = [resultSet intForColumn:@"id"];
                    NSString *name = [resultSet stringForColumn:@"name"];
                    int age = [resultSet intForColumn:@"age"];
                    double height = [resultSet doubleForColumn:@"height"];
                    NSLog(@"id = %d, name = %@, age = %d, height = %f", id, name, age, height);
                }
            }];
        }
      

results matching ""

    No results matching ""