上一篇《【iOS】数据库FMDB的使用(一)》中介绍了FMDB的基本使用。但是在项目一般一个数据库会在多个地方操作,为了避免冲突就需要多线程。FMDB也帮我们封装了多线程的方法。
上一篇《【iOS】数据库FMDB的使用(一)》中说了需要导入多少个文件到项目中。但是没有导入FMDB.h这个文件,因为这个文件里面就是包含了几个头文件。
两篇博客代码的下载地址:请点击我。
多线程的时候我们需要导入蓝色的这个文件,但是为了方便我们直接导入FMDB.h这个文件,这个就帮我在使用FMDB是需要的头文件都包含进来了。
多线程的操作和分多线程的操作点不一样。
[self.fmdbQueue inDatabase:^(FMDatabase *db) {
[db open];
// 这里做操作
}
[db close];
}];
都在在一个block里面操作。下面早就直接贴代码了。代码结果和上一篇的基本一致。
#import "QueueViewController.h"
#import "FMDB.h"
#import "Student.h"
@interface QueueViewController ()
@property (nonatomic,strong)FMDatabaseQueue *fmdbQueue;
@property (nonatomic,strong)FMDatabase *dataBase;
@property (nonatomic,strong)NSArray *nameArray;
@end
@implementation QueueViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.nameArray = @[@"①",@"②",@"③",@"④",@"⑤",@"⑥"];
[self initDataBase];
[self creatTabel];
// Do any additional setup after loading the view from its nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/**
* 新建一个数据库
*/
- (void)initDataBase{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
NSString *dbPath = [documentDirectory stringByAppendingPathComponent:@"Student1.db"];
NSLog(@"dbPath = %@",dbPath);
self.fmdbQueue = [[FMDatabaseQueue alloc] initWithPath:dbPath];
self.dataBase = [[FMDatabase alloc] initWithPath:dbPath];
}
/**
* 数据库中新建一个表
*/
- (void)creatTabel{
[self.dataBase open];
[self.dataBase executeUpdate:@"CREATE TABLE IF NOT EXISTS Student24 (rowid INTEGER PRIMARY KEY AUTOINCREMENT, name text,age text,address text)"];
[self.dataBase close];
}
/**
* 以学生模型插入数据库
*
* @param student 学生数据模型
*/
- (void)insterStudent:(Student *)student{
[self.fmdbQueue inDatabase:^(FMDatabase *db) {
[db open];
[db executeUpdate:@"INSERT INTO Student24 (name,age,address) VALUES (?,?,?)",student.name,student.age,student.address];
[db close];
}];
}
/**
* 更新一个学生的数据
*
* @param student 学生数据模型
*/
- (void)updateStudent:(Student *)student{
[self.fmdbQueue inDatabase:^(FMDatabase *db) {
[db open];
[db executeUpdate:@"UPDATE Student24 SET age= ? WHERE name = ?",student.age, student.name];
[db close];
}];
}
/**
* 删除数据库里面 一类名字的学生数据
*
* @param student 学生模型
*/
- (void)deleteStudent:(Student *)student{
[self.fmdbQueue inDatabase:^(FMDatabase *db) {
[db open];
[db executeUpdate:@"DELETE FROM Student24 WHERE name = ?",student.name];
[db close];
}];
}
/**
* 获取表中的所有数据 以学生模型的形式存储在数组中
*
* @return 表中的数据
*/
- (NSMutableArray *)getAllStudent{
NSMutableArray *stuArray = [[NSMutableArray alloc] init];
[self.fmdbQueue inDatabase:^(FMDatabase *db) {
[db open];
FMResultSet *result = [db executeQuery:@"SELECT * FROM Student24"];
while ([result next]) {
Student *model = [Student creatStudent:[result stringForColumn:@"name"] age:[result stringForColumn:@"age"] address:[result stringForColumn:@"address"]];
[stuArray addObject:model];
}
[db close];
}];
return stuArray;
}
/**
* 根据姓名 查找学生
*
* @param name name
*
* @return 名字为name的学生数组
*/
- (NSMutableArray *)getStudents:(NSString *)name{
NSMutableArray *stuArray = [[NSMutableArray alloc] init];
[self.fmdbQueue inDatabase:^(FMDatabase *db) {
[db open];
FMResultSet *result = [db executeQuery:@"SELECT * FROM Student24 WHERE name = ?",name];
while ([result next]) {
Student *model = [Student creatStudent:[result stringForColumn:@"name"] age:[result stringForColumn:@"age"] address:[result stringForColumn:@"address"]];
[stuArray addObject:model];
}
[db close];
}];
return stuArray;
}
/**
* 随机生成一个学生数据模型
*
* @return 学生数据模型
*/
- (Student *)getStudent{
Student *student = [Student creatStudent:self.nameArray[arc4random()%6] age:[NSString stringWithFormat:@"%u",arc4random()%100] address:[NSString stringWithFormat:@"%u",arc4random()%1000]];
return student;
}
/**
* 往数据库增加一条数据
*
* @param sender sender description
*/
- (IBAction)insterBtn:(UIButton *)sender {
Student *stu = [self getStudent];
[self insterStudent:stu];
}
/**
* 从数据库删除数据
*
* @param sender sender description
*/
- (IBAction)deleteBtn:(UIButton *)sender {
[self deleteStudent:[Student creatStudent:@"②" age:nil address:nil]];
}
/**
* 更新数据
*
* @param sender sender description
*/
- (IBAction)updateBtn:(UIButton *)sender {
[self updateStudent:[Student creatStudent:@"④" age:@"1" address:@"0"]];
}
/**
* 获取数据库里面的全部数据
*
* @param sender sender description
*/
- (IBAction)getAll:(UIButton *)sender {
NSMutableArray *temp = (NSMutableArray *)[self getAllStudent];
[temp enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
Student *student = (Student *)obj;
NSLog(@"查找全部: name = %@ age = %@",student.name,student.age);
}];
}
/**
* 数去数据里的一类数据
*
* @param sender sender description
*/
- (IBAction)getType:(UIButton *)sender {
NSMutableArray *temp = (NSMutableArray *)[self getStudents:@"③"];
[temp enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
Student *student = (Student *)obj;
NSLog(@"查找姓三的: name = %@ age = %@",student.name,student.age);
}];
}
最后上结果图: