专业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
: 执行多条sqlexecuteQuery
: 执行查询语句executeUpdate
: 执行除查询以外的语句,create, drop, insert, delete, update
FMDatabaseQueue
: 内部封装FMDatabase和串行queue,用于多线程操作数据库,并且提供事务,建议使用这个inDatabase
: 参数是一个闭包,在闭包里面可以获得FMDatabase对象inTransaction
: 使用事务.
FMResultSet
: 查询的结果集- 通过字段名称获取字段值
FMDB使用
建立
SQLiteManager
单例对象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
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
打开数据库和创建表
在
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]; }]; }
使用
FMDB
增删改查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]; }]; }
FMDB
修改数据/** * 测试修改数据 */ - (void)testUpdate { NSString *sql = @"UPDATE T_Person SET name = '刘德华' WHERE id = 2;"; [[SQLiteManager sharedManager].dbQueue inDatabase:^(FMDatabase *db) { [db executeUpdate:sql]; }]; }
FMDB
删除数据/** * 测试删除数据 */ - (void)testDelete { NSString *sql = @"DELETE FROM T_Person WHERE id = 4;"; [[SQLiteManager sharedManager].dbQueue inDatabase:^(FMDatabase *db) { [db executeUpdate:sql]; }]; }
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); }]; }
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); }]; }
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); } }]; }