FMDB(数据库)与Model(数据模型)的结合使用(CRUD)

一. 声明

  本文意在探讨, 也参考了几位大神的文章, 在文章最后我会把链接贴出来, 如果有叙述错误的地方, 请大神们指正!

二. 前言

  最近在做项目的时候, 我们有一个"我的消息"模块, 是这样设计的, 在本地创建一个数据库, 收到远程推送的消息, 将该条消息存入数据库, 进入"我的消息"页面, 读取数据库中的内容, 展示到该页面, 我们是用的FMDB来进行数据库的CRUD, 每一条消息为一个Model, 根据模型的属性列表来创建数据库的表, 以model为一个单位来进行数据库的添加, 删除, 更新, 查找. 自己也写了一个Demo来演示本节要讨论的内容.

上Demo: 联系人列表, 添加联系人, 删除联系人, 搜索联系人, 更新联系人信息

演示视频地址: http://v.youku.com/v_show/id_XMzkxMTA5NDg1Ng==.html?spm=a2h3j.8428770.3416059.1

Demo地址: https://github.com/RayLeeBoy/LCLFMDBModel

三. 正文

1. 读取数据库中的数据

    // 创建数据库
    [[LCLDataManager shareManager] createDatabaseWithName:@"user"];
    
    // 打开数据库
    [[LCLDataManager shareManager] openDatabase];
    
    // 根据传入的数据模型来创建表
    [[LCLDataManager shareManager] createTableWithName:@"t_contacts" class:[LCLPerson class]];
    
    // 从数据库中读取数据
    NSMutableArray * mArr = [[LCLDataManager shareManager] queryWithTableName:@"t_contacts"];
    
    // 赋给数据源
    self.dataSource = mArr;
    
    // 更新UI
    [self.tableView reloadData];
    
    // 关闭数据库
    [[LCLDataManager shareManager] closeDatabase];

2. 向数据库中添加数据

        // 数据库: 添加数据
        // 创建一条数据
        NSDate * date = [NSDate date];
        NSTimeInterval timeInterval = [date timeIntervalSince1970];
        NSString * userId = [NSString stringWithFormat:@"%.f", timeInterval];
        LCLPerson * person = [LCLPerson new];
        person.userId = userId;
        person.name = @"Ray";
        person.age = @"18";
        person.phone = @"18617673256";
        person.hobby = @"sing song";
        
        // 获取数据库
        [[LCLDataManager shareManager] createDatabaseWithName:@"user"];
        
        // 打开数据库
        [[LCLDataManager shareManager] openDatabase];
        
        // 获取表
        [[LCLDataManager shareManager] createTableWithName:@"t_contacts" class:[LCLPerson class]];
        
        // 向数据库写入数据
        [[LCLDataManager shareManager] insertWithTableName:@"t_contacts" model:person];
        
        // 关闭数据库
        [[LCLDataManager shareManager] closeDatabase];

3. 编辑已经存在的数据

        // 数据库: 更新数据
        // 这个person指的是已经从数据库中读取的数据
        LCLPerson * person = nil;
        
        // 更改某个属性值
        person.age = @"20";
        
        // 获取数据库
        [[LCLDataManager shareManager] createDatabaseWithName:@"user"];
        
        // 打开数据库
        [[LCLDataManager shareManager] openDatabase];
        
        // 获取表
        [[LCLDataManager shareManager] createTableWithName:@"t_contacts" class:[LCLPerson class]];
        
        // 更新数据 primaryKey: 表里的字段名, primaryValue: 字段对应的值
        [[LCLDataManager shareManager] updateWithTableName:@"t_contacts" model:person primaryKey:@"userId" primaryValue:person.userId];
        
        // 关闭数据库
        [[LCLDataManager shareManager] closeDatabase];    

4. 从数据库中查找数据

    // 数据库: 搜索数据
    // 获取数据库
    [[LCLDataManager shareManager] createDatabaseWithName:@"user"];
    
    // 打开数据库
    [[LCLDataManager shareManager] openDatabase];
    
    // 获取表
    [[LCLDataManager shareManager] createTableWithName:@"t_contacts" class:[LCLPerson class]];
    
    // 从数据库中查找数据, key: 表中的字段名, value: 字段对应的值
    NSMutableArray * mArr = [[LCLDataManager shareManager] queryWithTableName:@"t_contacts" key:@"phone" value:self.searchTextField.text];
    
    // 赋给数据源
    self.dataSource = mArr;
    
    // 更新UI
    [self.tableView reloadData];
    
    // 关闭数据库
    [[LCLDataManager shareManager] closeDatabase];

5. 从数据库中删除数据

        // 数据库: 删除数据
        // 获取数据库
        [[LCLDataManager shareManager] createDatabaseWithName:@"user"];

        // 打开数据库
        [[LCLDataManager shareManager] openDatabase];

        // 要删除的数据
        LCLPerson * person = self.dataSource[indexPath.row];
        
        // 从数据库中把这条数据删除, key: 表中的字段, value: 字段对应的值
        [[LCLDataManager shareManager] removeWithTableName:@"t_contacts" key:@"userId" value:person.userId];

        // 关闭数据库
        [[LCLDataManager shareManager] closeDatabase];

        // 更新数据源
        [self.dataSource removeObjectAtIndex:indexPath.row];
        
        // 更新UI
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

四. 参考文章

  1. FMDB使用方法

  2. iOS-FMDB数据库之增删改查使用

五. 总结

  Demo演示放在了youku, Demo代码放在了github, 大家可以下载看完整的代码及实现逻辑, 有不足的地方, 或者大家有更好的想法, 欢迎来此讨论!

Talk is cheap. Show me the code.