iOS开发 数据存储之FMDB

一.FMDB介绍

FMDB同时兼容 ARC 和非 ARC 工程,会自动根据工程配置来调整相关的内存管理代码

二.FMDB类介绍

1.FMDatabase:是一个提供 SQLite 数据库的类,用于执行 SQL 语句

2.FMResultSet:用在FMDatabase中执行查询的结果的类

3.FMDatabaseQueue:在多线程下查询和更新数据库用到的类,它是线程安全的

三.FMDB操作

1.数据库创建:

创建数据库只需要一行代码即可,当改文件不存在时,FMDatabase会自己创建

1.一个系统路劲.磁盘中可以不存在此文件,如果不存在会自动创建

2.一个空的字符串 @"".会在临时位置创建一个空的数据库,当FMDatabase连接关闭时,该数据库会被删除

3.NULL.会在内存中创建一个数据库,当 FMDatabase 连接关闭时,该数据库会被销毁

//获得存放数据库文件的沙盒地址
+ (NSString *)databaseFilePath
{
    NSArray *filePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [filePath objectAtIndex:0];
    NSString *dbFilePath = [documentPath stringByAppendingPathComponent:@"person.db"];
    return dbFilePath;
}

//创建数据库
+ (void)creatDatabase
{
    fmdb = [FMDatabase databaseWithPath:[self databaseFilePath]];
    //为数据库设置缓存,提高查询效率
    [fmdb setShouldCacheStatements:YES];
}

2.数据库打开:

数据库必须是打开状态,才能与之交互.如果没有足够的资源和权限来打开\创建数据库,数据库会打开失败.通常打开完操作操作后,需要调用close方法来关闭数据库

if (![fmdb open]) {
    // error 
    return;
}
// some operation
// ...
[fmdb close];

3.创建表:

//创建表
+ (void)creatTable
{
    //先判断数据库是否存在,如果不存在,创建数据库
    if (!fmdb) {
        [self creatDatabase];
    }
    //判断数据库是否已经打开,如果没有打开,提示失败
    if (![fmdb open]) {
       	NSLog(@"数据库打开失败");
        return;
    }
    //为数据库设置缓存,提高查询效率
    [fmdb setShouldCacheStatements:YES];
    //判断数据库中是否已经存在这个表,如果不存在则创建该表
    if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
        // SQLite将数据划分为以下几种存储类型:
        // 1.integer : 整型值
        // 2.real : 浮点值
        // 3.text : 文本字符串
        // 4.blob : 二进制数据(比如文件)
        [fmdb executeUpdate:@"CREATE TABLE IF NOT EXISTS PERSON_FMDB_CACHE(id INTEGER PRIMARY KEY AUTOINCREMENT   NOT NULL, PERSON_ID INTEGER, PERSON_NAME TEXT, PERSON_AGE INTEGER, PERSON_SEX TEXT, PERSON_HEIGHT TEXT)"];
        NSLog(@"创建完成");
    }
    // 添加字段
    if (![fmdb columnExists:@"PERSON_BIR" inTableWithName:@"PERSON_FMDB_CACHE"]) {
        [fmdb executeUpdate:@"ALTER TABLE PERSON_FMDB_CACHE ADD PERSON_BIR VARCHAR(30)"];
    }
}

4.删除表:

//删除表
+ (void)dropTable
{
    if (!fmdb) {
        [self creatDatabase];
    }
    if (![fmdb open]) {
        NSLog(@"数据库打开失败");
        return;
    }
    if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
        [self creatTable];
    }
    [fmdb executeUpdate:@"DROP TABLE IF EXISTS PERSON_FMDB_CACHE"];
    [fmdb close];
}

5.数据库添加数据(增):

#pragma mark - 增
+ (BOOL)insertData:(Person *)person
{
    return [WLFMDB insertDatas:@[person]];
}
+ (BOOL)insertDatas:(NSArray<Person *> *)persons
{
    if (!fmdb) {
        [self creatDatabase];
    }
    if (![fmdb open]) {
        NSLog(@"数据库打开失败");
        return NO;
    }
    if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
        [self creatTable];
    }
    for (Person *person in persons) {
        //现在表中查询有没有相同的元素,如果有,做修改操作
        FMResultSet *res = [fmdb executeQuery:@"SELECT * FROM PERSON_FMDB_CACHE WHERE PERSON_ID = ?",@(person.pId).stringValue];
        if (![res next]) {
            //向数据库中插入一条数据
            [fmdb executeUpdate:@"INSERT INTO PERSON_FMDB_CACHE (PERSON_ID, PERSON_NAME, PERSON_AGE, PERSON_SEX, PERSON_HEIGHT) VALUES (?, ?, ?, ?, ?)",@(person.pId).stringValue, person.name, @(person.age).stringValue, person.sex, @(person.height)];
        } else {
            //修改操作
            [fmdb executeUpdate:@"UPDATE PERSON_FMDB_CACHE SET PERSON_NAME = ?, PERSON_AGE = ?, PERSON_SEX = ?, PERSON_HEIGHT = ? WHERE PERSON_ID = ?", person.name, @(person.age), person.sex, @(person.height), @(person.pId)];
        }
    }
    [fmdb close];
    return YES;
}

6.数据库删除数据(删):

#pragma mark - 删
+ (BOOL)deleteDataWithId:(NSInteger)pId
{
    if (!fmdb) {
        [self creatDatabase];
    }
    if (![fmdb open]) {
        NSLog(@"数据库打开失败");
        return NO;
    }
    if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
        [self creatTable];
    }
    [fmdb executeUpdate:@"DELETE FROM PERSON_FMDB_CACHE WHERE PERSON_ID = ?",@(pId)];
    [fmdb close];
    return NO;
}
+ (BOOL)deleteAllData
{
    if (!fmdb) {
        [self creatDatabase];
    }
    if (![fmdb open]) {
        NSLog(@"数据库打开失败");
        return NO;
    }
    if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
        [self creatTable];
    }
    [fmdb executeUpdate:@"DELETE FROM PERSON_FMDB_CACHE"];
    [fmdb close];
    return YES;
}

7.数据库改数据(改):

#pragma mark - 改
+ (BOOL)updateDataName:(NSString *)aName byID:(NSInteger)aID
{
    if (!fmdb) {
        [self creatDatabase];
    }
    if (![fmdb open]) {
        NSLog(@"数据库打开失败");
        return NO;
    }
    if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
        [self creatTable];
    }
    [fmdb executeUpdate:@"UPDATE PERSON_FMDB_CACHE SET PERSON_NAME = ? WHERE PERSON_ID = ?", aName, @(aID)];
    [fmdb close];
    return YES;
}
+ (BOOL)updateData:(Person *)person
{
    if (!fmdb) {
        [self creatDatabase];
    }
    if (![fmdb open]) {
        NSLog(@"数据库打开失败");
        return NO;
    }
    if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
        [self creatTable];
    }
    [fmdb executeUpdate:@"UPDATE PERSON_FMDB_CACHE SET PERSON_NAME = ?, PERSON_AGE = ?, PERSON_SEX = ?, PERSON_HEIGHT = ? WHERE PERSON_ID = ?", person.name, @(person.age), person.sex, @(person.height), @(person.pId)];
    return YES;
}

8.数据库查数据(查):

#pragma mark - 查
+ (NSMutableArray<Person *> *)getDataWithId:(NSInteger)pId
{
    if (!fmdb) {
        [self creatDatabase];
    }
    if (![fmdb open]) {
        NSLog(@"数据库打开失败");
        return nil;
    }
    if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
        [self creatTable];
    }
    FMResultSet *results = [fmdb executeQuery:@"SELECT * FROM PERSON_FMDB_CACHE WHERE PERSON_ID = ?", @(pId)];
    NSMutableArray<Person *> *persons = [[NSMutableArray alloc] init];
    while ([results next]) {
        Person *person = [[Person alloc] init];
        person.pId = [results intForColumn:@"PERSON_ID"];
        person.name = [results stringForColumn:@"PERSON_NAME"];
        person.age = [results intForColumn:@"PERSON_AGE"];
        person.sex = [results stringForColumn:@"PERSON_SEX"];
        person.height = [results doubleForColumn:@"PERSON_HEIGHT"];
        [persons addObject:person];
    }
    [results close];
    [fmdb close];
    return persons;
}
+ (NSMutableArray<Person *> *)getAllData
{
    if (!fmdb) {
        [self creatDatabase];
    }
    if (![fmdb open]) {
        NSLog(@"数据库打开失败");
        return nil;
    }
    if(![fmdb tableExists:@"PERSON_FMDB_CACHE"]) {
        [self creatTable];
    }
    FMResultSet *results = [fmdb executeQuery:@"SELECT * FROM PERSON_FMDB_CACHE"];
    NSMutableArray<Person *> *persons = [[NSMutableArray alloc] init];
    while ([results next]) {
        Person *person = [[Person alloc] init];
        person.pId = [results intForColumn:@"PERSON_ID"];
        person.name = [results stringForColumn:@"PERSON_NAME"];
        person.age = [results intForColumn:@"PERSON_AGE"];
        person.sex = [results stringForColumn:@"PERSON_SEX"];
        person.height = [results doubleForColumn:@"PERSON_HEIGHT"];
        [persons addObject:person];
    }
    [results close];
    [fmdb close];
    return persons;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值