FMDB

作者: 箫声_筱昇 | 来源:发表于2016-04-26 20:14 被阅读534次

    FMDB

    • 第三方的框架.它是对 libsqlite2框架的封装.使用方法与 sqlite 类似.并且它是对于多线程的并发操作进行了处理,所以线程是安全的.是一款简洁/易用的封装库.

    优点

    • 1,对多线程的并发操作进行处理,所以是线程安全的.
    • 2,以 OC 的方式封装了 SQLITE 的c 语言 API, 使用起来更加的方便.
    • 3,FMDB 是轻量级的框架.使用灵活.

    缺点

    • 只能限制在 IOS 开发的时候使用.

    FMDB 中重要的类:

    • FMDatabase:一个FMDatabase对象就代表一个单独的 SQLite 数据库,用来执行 SQL 语句.
    • FMResultSet使用FMDatabase执行查询后的结果集
    • FMDatabaseQueue: 用于在多线程中执行多个查询或更新,它是线程安全的.

    在使用FMDB 时,要使用终端进行导入.

    • 创建 FMDatabase 对象时参数为 SQLite 数据库文件路径.该路径可以是以下三种之一.
      • 1,文件路径,该文件路径无需真实存在,如果路径不存在会自动创建;
      • 2,空字符串(@"").表示会在临时目录创建一个空的数据库,当 FMDatabase 连接关闭时,文件也会被删除.
      • 3,NULL将创建一个内在数据库.同样的.当 FMDatabase 连接关闭时,数据将会被销毁.
    @interface RootViewController ()
    @property (nonatomic, strong) FMDatabase *database;//声明 database 属性.
    @end
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //建表操作
        [self opertationNoResultWithSql:@"create table if not exists student(name text primary key ,sex text,age integer)" operationTag:@"建表"];
        [self opertationNoResultWithSql:@"insert into student(name,sex,age) values ('张丽','女',23)" operationTag:@"插入数据"];
        [self opertationNoResultWithSql:@"alter table student add number integer" operationTag:@"在插入一列表"];
        
        NSArray *array = [self qureyWithSql:@"select * from student"];
        NSLog(@"%@",array);
        /**
         *  1,有一个路径来存储数据库文件
         *  2,创建数据库文件
         *  3,增删改查的操作
         *  1)通过 FMDB ,能不能动态获得一张表有多少个字段
         *  2)FMDB 中,能不能动态获得某一个字段的类型.
            3)FMDB 中,能不能动态获得字段的名称.
         */
    }
    
    • 1,获取路径.
    - (NSString *)dbPath{
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject)];
    NSLog(@"%@",doc);
    NSString *documents = [doc stringByAppendingPathComponent:@"fmdb.sqlite"];
    return documents;
    }
    
    • 2,创建数据库对象
    - (FMDatabase *)openOrCreateDB{
    /**
      *  此写法可以确保self.database = [FMDatabase databaseWithPath:[self dbPath]];
      *  只会被执行一次.不会在程序每次运行时,进行多次创建.
      */
    static dispatch_once_t onceToken;
    dispatch-once(&onceToken,^{
    self.database = [FMDatabase databaseWithPath:[self dbPath];
    });
    //打开数据库
    if([self.database open]){
    NSLog(@"打开成功");
    return self.database;
    }else{
    NSLog(@"数据库打开失败");
    return nil;
    }
    }
    
    • 3,无返回结果集
    -(BOOL)opertationNoResultWithSql:(NSString *)sql operationTag:(NSString *)tag{
        //打开数据库
        FMDatabase *db = [self openOrCreateDB];
        //执行非查询操作
        BOOL isSuccess = [db executeUpdate:sql];
        /**
         *  当操作完成,关闭数据库
         */
        [db close];
        if (isSuccess) {
            NSLog(@"%@操作成功",tag);
            return YES;
        }else{
            NSLog(@"%@操作失败",tag);
            return NO;
        }
    }
    
    • 4,查询操作(又返回结果集)
    - (NSArray*)qureyWithSql:(NSString *)sql{
        //打开数据库
        FMDatabase *db = [self openOrCreateDB];
        /**
         *  执行操作
         * 1,执行sql 语句,将返回结果先暂存到 resultSet 中
         */
        FMResultSet *resultSet = [db executeQuery:sql];
        //2,从 resultSet 中取出每一条记录
        /**
         *  next:做的是 sqlite3_step(stament) == row进行判断;
         */
        NSMutableArray *array = [[NSMutableArray alloc] init];
        while ([resultSet next]) {
            /**
             *  当字典建立在循环外面的时候.只是初始化一次.然而后面在进行查询的额时候,会
             *  将前面的结果给覆盖掉.所以子啊每次执行 while 循环的时候,都是
             *  一个新的记录被取出,所以我们需要一个新的字典来盛放新的记录.所有我们进
             *  while 循环的时候都需要构建一个新的字典对象.
             */
            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            NSString *name = [resultSet stringForColumn:@"name"];
            [dict setObject:name forKey:@"name"];
            NSString *sex = [resultSet stringForColumn:@"sex"];
            [dict setObject:sex forKey:@"sex"];
            int age = [resultSet intForColumn:@"age"];
            [dict setObject:@(age) forKey:@"age"];
            int number = [resultSet intForColumn:@"number"];
            [dict setObject:@(number) forKey:@"number"];
            //将字典添加到数组中.
            [array addObject:dict];
        }
        //释放 resultSet
        [resultSet close];
        [db close];//关闭数据库.
    return array;
    }
    

    相关文章

      网友评论

        本文标题:FMDB

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