iOS FMDB有返回结果集和无返回结果集

准备工作

在当前类的延展中声明一个数据库的对象

@interface RootViewController ()
@property (strong, nonatomic)FMDatabase *db;
@end

创建一个数据库的路径

- (NSString *)dbPath{
    NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
NSUserDomainMask, YES)firstObject] stringByAppendingPathComponent:@"FMDB.sqlite"];
    return dbPath;
}

打开或者创建一个数据库

- (FMDatabase *)openOrCreate{
    //创建数据库对象
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        self.db = [FMDatabase databaseWithPath:[self dbPath]];
    });
    
    if ([self.db open]) {
        return self.db;
    }else {
        NSLog(@"打开失败");
        return nil;
    }
}

FMDB之无返回结果集

一切不是SELECT命令的命令都视为更新。这包括 CREATE, UPDATE, INSERT,ALTER,COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE (等)。简单来说,只要不是以SELECT开头的命令都是UPDATE命令,也就是无返回结果集。
示例代码

- (BOOL)opertationNoResultWithSql:(NSString *)sql operationTag:(NSString *)tag{
//打开数据库
    FMDatabase *db = [self openOrCreate];
//执行非查询操作
    BOOL isSuccess = [db executeUpdate:sql];
//当操作完成后,关闭数据路
    [self.db close];
    if (isSuccess) {
        NSLog(@"%@操作成功",tag);
        return YES;
    }else{
        NSLog(@"%@操作失败",tag);
        return NO;
    }
}

FMDB之有返回结果集

  • SELECT命令就是查询,执行查询的方法是以 -excuteQuery开头的。
  • 执行查询时,如果成功返回FMResultSet对象, 错误返回nil. 与执行更新相当,支持使用 NSError**参数。同时,你也可以使用 -lastErrorCode和-lastErrorMessage获知错误信息。
  • 为了遍历查询结果,你可以使用while循环。你还需要知道怎么跳到下一个记录。使用FMDB,很简单实现。

示例代码

- (NSArray *)queryWithSql:(NSString *)sql{
//打开数据库
    FMDatabase *db = [self openOrCreate];
//执行sql语句,将返回结果先暂存到resultSet中
    FMResultSet *resultSet = [db executeQuery:sql];
//从resultSet中取出每一条记录
    NSMutableArray *array = [NSMutableArray array];
    while ([resultSet next]) {//next:判断sqlite3_step(stament) == row
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
/*每次执行while循环的时候,都是一个新的记录被取出,所以我们需要一个新的字典来盛放新的记录,
所以每次进while循环的时候都需要构建一个新的字典对象。*/
        NSString *name = [resultSet stringForColumn:@"name"];
        NSString *gender = [resultSet stringForColumn:@"gender"];
        NSInteger age = [resultSet intForColumn:@"age"];
    
        [dic setValue:name forKey:@"name"];
        [dic setValue:gender forKey:@"gender"];
        [dic setValue:@(age) forKey:@"age"];
        [array addObject:dic];
    }
//释放resultSet
    [resultSet close];
//关闭数据库
    [db close];
    return array;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查询集API 参...
    阳光小镇少爷阅读 3,852评论 0 8
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,571评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • 华为的人力资源增值注重"人力资本增值最大化,人力成本最小化",在实践中做到了关注人才动态配置,关注人才质量,关注人...
    无敌可爱ccc阅读 544评论 0 0