【iOS】数据库FMDB的使用(二)

上一篇《【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);
    }];
}

最后上结果图:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值