一. 声明
本文意在探讨, 也参考了几位大神的文章, 在文章最后我会把链接贴出来, 如果有叙述错误的地方, 请大神们指正!
二. 前言
最近在做项目的时候, 我们有一个"我的消息"模块, 是这样设计的, 在本地创建一个数据库, 收到远程推送的消息, 将该条消息存入数据库, 进入"我的消息"页面, 读取数据库中的内容, 展示到该页面, 我们是用的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使用方法
五. 总结
Demo演示放在了youku, Demo代码放在了github, 大家可以下载看完整的代码及实现逻辑, 有不足的地方, 或者大家有更好的想法, 欢迎来此讨论!
Talk is cheap. Show me the code.