#准备工作 在当前类的延展中声明一个数据库的对象
@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;}复制代码