一个小小的demo,实现电商搜索产品的时候,保存用户搜索记录的需求。使用FMDB来达到数据持久化。
先上效果
- 1、创建模型
创建一个模型,数据通过模型进行传递,在工具类中进行的增删改查操作,也是通过传递模型来实现的。
/** 名称 */
@property (nonatomic, copy) NSString *name;
/** 编号 */
@property (nonatomic, assign) NSInteger ID_No;
name为搜索的内容,从数据库取出模型的时候,根据编号来取出name,对button的文本进行赋值;编号的赋值也是根据当前历史记录中的buttons的tag值进行赋值。编号从1开始,对应数据库中的自增键,便于查看起始值。
- 2、封装FMDB工具类
FMDB是直接拖进项目里面的,历史记录主要涉及增,删、查这三项功能,因此在工具类中,对着三项操作进行实现。
/**
* 插入数据
*
* @param model 插入模型数据
*
* @return value
*/
+ (BOOL)insertModel:(ArchiveModel *)model;
/**
* 查询数据,如果 传空 默认会查询表中所有数据
*
* @param querySql sql语句
*
* @return value
*/
+ (NSArray *)queryData:(NSString *)querySql;
/**
* 删除数据,根据名称ID_No,如果 传空 默认会删除表中所有数据
*
* @param model 删除模型数据,从中取出ID_No
*
* @return value
*/
+ (BOOL)deleteData:(ArchiveModel *)model;
/**
* 删除数据,根据名称name
*
* @param name 名称
*
* @return value
*/
+ (BOOL)deleteByNameString:(NSString *)name;
- 3、获取数据,赋值给buttons的文本
/**
* 加载数据库,给buttons赋值
*/
- (void)loadDB
{
[self.modelArr removeAllObjects];
[self.dataArr removeAllObjects];
NSArray *models = [FQFmdbTool queryData:nil];
[self.modelArr addObjectsFromArray:models];
for (ArchiveModel* model in self.modelArr) {
[self.dataArr addObject:model.name];
}
// 赋值buttons
[self.demoView layoutButtonsWithArr:self.dataArr];
}
- 4、增加历史记录
需要注意的是,如果点击的是历史记录中的某一个,那么就应该对buttons进行重新排布,将点击的那个记录放到第一个。那么久需要修改所有buttons的ID_No了,所以采取的方法是先删除掉所点击的这条记录,再将这条记录插入到数据表中,之后再进行重新排布。
if ([FQFmdbTool isExistSearchText:searchBar.text]) {
NSLog(@"搜索文本存在,要改变文本在数据库中的位置,并重新排布");
[self deleteToConfigurationByNameString:searchBar.text]; // 先删除 ,后增加
[self insertHistoryText:searchBar.text]; // 增加(添加一条数据)
}else{
NSLog(@"搜索文本不存在,添加这条数据到数据库中");
[self insertHistoryText:searchBar.text]; // 添加一条数据
}
/**
* 从searchBar插入一条数据
*
* @param text
*/
- (void)insertHistoryText:(NSString*)text
{
// 插入数据
ArchiveModel* model = [ArchiveModel modelWith:text no:self.modelArr.count+1];
BOOL insert = [FQFmdbTool insertModel:model];
if (insert) {
NSLog(@"插入数据成功%@,%ld",model.name,(long)model.ID_No);
}else{
NSLog(@"插入数据失败");
}
// 更新数据库
[self loadDB];
}```
* 5、实现button的删除以及删除数据库中相应的name
长按button,右上角会出现一个小红叉,点击小红叉即可删除该条历史记录,由于小红叉的frame已经超出了button的bounds,因此要在自定义的button中重写hitTest方法。删除该条历史记录后,重新获取数据库中的数据,并重新保存到模型数组中,再进行一次buttons的排布。
/**
- 删除一条数据
- @param name text
- @param tag tag
*/
-
(void)deleteCurrentHistoryWithName:(NSString*)name ID_No:(NSInteger)tag
{ArchiveModel* model = [ArchiveModel modelWith:name no:tag+1];
BOOL delete = [FQFmdbTool deleteData:model];
if (delete) {
NSLog(@"删除数据成功%@,%ld",model.name,(long)model.ID_No);
// 重新获取数据库中的数据,重新写入,并修改所有历史记录的ID_No
[self modifyAllHistory];
}else{
NSLog(@"删除数据失败");
}// 更新数据库
[self loadDB];
}
> Navicat Premium 查看
![效果图](http://upload-images.jianshu.io/upload_images/1804393-71c3fe4562ba0fd2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
附上传送门:[demo下载地址](https://github.com/hulk374/FQButtonsLayoutDemo)
参考资料: [非常感谢](http://blog.csdn.net/mr_liu_easy_ios/article/details/51487596)