h];
// 第四步:数据库执行相关的操作
// 需要判断数据库打开的时候才进行执行语句
if (self.database.open) {
BOOL result = [self.database executeUpdate:createSql];
if (result) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败");
}
}
// 第五步:关闭数据库
[self.database close];
}
#pragma mark - 插入
- (IBAction)insertIntoAction:(id)sender
{
// 第一步:打开数据库
[self.database open];
// 第二步:进行相关的操作
NSArray *nameArray = @[@"MBBoy", @"BoomSky", @"小明"];
for (NSString *name in nameArray) {
BOOL result = [self.database executeUpdate:@"insert into t_student(name, age, sax) values(?, ?, ?)", name, @69, @"男"]; // integer的数据不能在这里使用,必须使用一个对象型数据,比如NSNumber、NSString...
[self.database executeUpdate:@"INSERT INTO t_student(name, age, sax) VALUES (?, ?, ?);" withArgumentsInArray:@[@"xiaoming", @12, @"男"]];
if (result) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失败");
}
}
[self.database close];// 更新数据// 删除数据// 增加(插入)数据
}
#pragma mark - 更新
- (IBAction)updateAction:(id)sender
{
[self.database open];
BOOL result = [self.database executeUpdate:@"update t_student set name = ? where name = ?", @"xiaoming", @"小明"];
if (result) {
NSLog(@"更新成功");
} else {
NSLog(@"更新失败");
}
[self.database close];
}
#pragma mark - 删除
- (IBAction)deleteAction:(id)sender
{
[self.database open];
BOOL result = [self.database executeUpdate:@"delete from t_student where name = ?", @"MBBoy"];
if (result) {
NSLog(@"删除成功");
} else {
NSLog(@"删除失败");
}
[self.database close];
}
#pragma mark - 查询
- (IBAction)selectAction:(id)sender
{
[self.database open];
// 查询结果使用的类FMResultSet
FMResultSet *resultSet = [self.database executeQuery:@"select * from t_student"];
// 遍历出需要的结果内容
while (resultSet.next) {
NSInteger ID = [resultSet intForColumn:@"id"];
NSString *name = [resultSet objectForColumnName:@"name"];
NSInteger age = [resultSet intForColumn:@"age"];
NSString *sax = [resultSet objectForColumnName:@"sax"];
NSLog(@"id = %ld name = %@, age = %ld, sax = %@", ID, name, age, sax);
}
[self.database close];
}
@end
4. FMDB实现多线程操作
1> 概述
-
多个线程更新相同的资源导致数据竞争时使用等待队列(等待现在执行的处理结束)。
-
以队列的形式添加是 FMDB 比较常用的添加方式。
-
FMDB 不支持多个线程同时操作,一般使用串行方式实现相关的操作。
2> 创建操作队列
使用的初始化方法
+ (instancetype)databaseQueueWithPath:(NSString*)aPath
3> 把操作打包放在操作队列中
打包的方法
- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block
在 Block 中添加串行队列
4> 实例代码
#pragma mark - 以队列的形式添加很多学生
- (IBAction)insertManyStudent:(id)sender
{
// 以队列的形式添加学生是FMDB比较常用的添加方式
// FMDB不支持多个线程同时操作,一般使用串行方式实现相关的操作
[self.database open];
// 第一步:创建操作队列
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:self.filePath];
// 标识:记录是否操作成功
__block BOOL isSucceed = YES;
// 第二步:把操作打包放在操作队列中
NSString *insertSql = @"insert into t_studen(name, age, sax) values(?, ?, ?)";
[queue inTransaction:^(FMDatabase *db, BOOL * |