http://www.jianshu.com/p/54e74ce87404

最近在项目中需要在多个页面对同样的数据进行相关操作,于是便用到了FMDB数据库操作,以下便是FMDB的一些简单的使用方法。附Demo一份:FMDBDemo

1.为了更好的的进行管理,先创建了FMDB的单例

@interface DataBase : NSObject
+ (instancetype)sharedDataBase; #import "DataBase.h" #import <FMDB.h> #import "Person.h"
#import "Car.h"
static DataBase *_DBCtl = nil; @interface DataBase()<NSCopying,NSMutableCopying>{
FMDatabase *_db; }
@end @implementation DataBase +(instancetype)sharedDataBase{ if (_DBCtl == nil) { _DBCtl = [[DataBase alloc] init]; [_DBCtl initDataBase]; } return _DBCtl; } +(instancetype)allocWithZone:(struct _NSZone *)zone{ if (_DBCtl == nil) { _DBCtl = [super allocWithZone:zone]; } return _DBCtl; } -(id)copy{ return self; } -(id)mutableCopy{ return self; } -(id)copyWithZone:(NSZone *)zone{ return self; } -(id)mutableCopyWithZone:(NSZone *)zone{ return self; } -(void)initDataBase{
// 获得Documents目录路径 NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // 文件路径 NSString *filePath = [documentsPath stringByAppendingPathComponent:@"model.sqlite"]; // 实例化FMDataBase对象 _db = [FMDatabase databaseWithPath:filePath]; [_db open]; // 初始化数据表
NSString *personSql = @"CREATE TABLE 'person' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,'person_id' VARCHAR(255),'person_name' VARCHAR(255),'person_age' VARCHAR(255),'person_number'VARCHAR(255)) ";
NSString *carSql = @"CREATE TABLE 'car' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,'own_id' VARCHAR(255),'car_id' VARCHAR(255),'car_brand' VARCHAR(255),'car_price'VARCHAR(255)) "; [_db executeUpdate:personSql];
[_db executeUpdate:carSql]; [_db close]; }

现在创建好了数据库,可以保存person对象与car对象的相关属性
数据库中创建了两张表person表与car表,分别管理person的数据与car的数据,通过person_id 与own_id进行关联
2.提供接口

#pragma mark - Person
/**
* 添加person
*
*/
- (void)addPerson:(Person *)person;
/**
* 删除person
*
*/
- (void)deletePerson:(Person *)person;
/**
* 更新person
*
*/
- (void)updatePerson:(Person *)person; /**
* 获取所有数据
*
*/
- (NSMutableArray *)getAllPerson; #pragma mark - Car /**
* 给person添加车辆
*
*/
- (void)addCar:(Car *)car toPerson:(Person *)person;
/**
* 给person删除车辆
*
*/
- (void)deleteCar:(Car *)car fromPerson:(Person *)person;
/**
* 获取person的所有车辆
*
*/
- (NSMutableArray *)getAllCarsFromPerson:(Person *)person;
/**
* 删除person的所有车辆
*
*/
- (void)deleteAllCarsFromPerson:(Person *)person;

3.接口的实现

#pragma mark - 接口

- (void)addPerson:(Person *)person{
[_db open]; NSNumber *maxID = @(0); FMResultSet *res = [_db executeQuery:@"SELECT * FROM person "];
//获取数据库中最大的ID
while ([res next]) {
if ([maxID integerValue] < [[res stringForColumn:@"person_id"] integerValue]) {
maxID = @([[res stringForColumn:@"person_id"] integerValue] ) ;
} }
maxID = @([maxID integerValue] + 1); [_db executeUpdate:@"INSERT INTO person(person_id,person_name,person_age,person_number)VALUES(?,?,?,?)",maxID,person.name,@(person.age),@(person.number)]; [_db close]; } - (void)deletePerson:(Person *)person{
[_db open]; [_db executeUpdate:@"DELETE FROM person WHERE person_id = ?",person.ID]; [_db close];
} - (void)updatePerson:(Person *)person{
[_db open]; [_db executeUpdate:@"UPDATE 'person' SET person_name = ? WHERE person_id = ? ",person.name,person.ID];
[_db executeUpdate:@"UPDATE 'person' SET person_age = ? WHERE person_id = ? ",@(person.age),person.ID];
[_db executeUpdate:@"UPDATE 'person' SET person_number = ? WHERE person_id = ? ",@(person.number + 1),person.ID]; [_db close];
} - (NSMutableArray *)getAllPerson{
[_db open]; NSMutableArray *dataArray = [[NSMutableArray alloc] init]; FMResultSet *res = [_db executeQuery:@"SELECT * FROM person"]; while ([res next]) {
Person *person = [[Person alloc] init];
person.ID = @([[res stringForColumn:@"person_id"] integerValue]);
person.name = [res stringForColumn:@"person_name"];
person.age = [[res stringForColumn:@"person_age"] integerValue];
person.number = [[res stringForColumn:@"person_number"] integerValue]; [dataArray addObject:person]; } [_db close]; return dataArray; }
/**
* 给person添加车辆
*
*/
- (void)addCar:(Car *)car toPerson:(Person *)person{
[_db open]; //根据person是否拥有car来添加car_id
NSNumber *maxID = @(0); FMResultSet *res = [_db executeQuery:[NSString stringWithFormat:@"SELECT * FROM car where own_id = %@ ",person.ID]]; while ([res next]) {
if ([maxID integerValue] < [[res stringForColumn:@"car_id"] integerValue]) {
maxID = @([[res stringForColumn:@"car_id"] integerValue]);
} }
maxID = @([maxID integerValue] + 1); [_db executeUpdate:@"INSERT INTO car(own_id,car_id,car_brand,car_price)VALUES(?,?,?,?)",person.ID,maxID,car.brand,@(car.price)]; [_db close]; }
/**
* 给person删除车辆
*
*/
- (void)deleteCar:(Car *)car fromPerson:(Person *)person{
[_db open]; [_db executeUpdate:@"DELETE FROM car WHERE own_id = ? and car_id = ? ",person.ID,car.car_id]; [_db close]; }
/**
* 获取person的所有车辆
*
*/
- (NSMutableArray *)getAllCarsFromPerson:(Person *)person{ [_db open];
NSMutableArray *carArray = [[NSMutableArray alloc] init]; FMResultSet *res = [_db executeQuery:[NSString stringWithFormat:@"SELECT * FROM car where own_id = %@",person.ID]];
while ([res next]) {
Car *car = [[Car alloc] init];
car.own_id = person.ID;
car.car_id = @([[res stringForColumn:@"car_id"] integerValue]);
car.brand = [res stringForColumn:@"car_brand"];
car.price = [[res stringForColumn:@"car_price"] integerValue]; [carArray addObject:car]; }
[_db close]; return carArray; }
- (void)deleteAllCarsFromPerson:(Person *)person{
[_db open]; [_db executeUpdate:@"DELETE FROM car WHERE own_id = ?",person.ID]; [_db close];
}

提供了公共接口之后,在任何一个页面都能进行数据的操作
4 使用
1).添加数据

添加person.png

只要在右上角的点击事件中填写如下代码,可以很快的在数据库中添加person数据

  /**
* 添加数据到数据库
*/
- (void)addData{ NSLog(@"addData"); int nameRandom = arc4random_uniform(1000);
NSInteger ageRandom = arc4random_uniform(100) + 1; NSString *name = [NSString stringWithFormat:@"person_%d号",nameRandom];
NSInteger age = ageRandom; Person *person = [[Person alloc] init];
person.name = name;
person.age = age; [[DataBase sharedDataBase] addPerson:person]; self.dataArray = [[DataBase sharedDataBase] getAllPerson]; [self.tableView reloadData]; }

2).删除数据

删除car.png

删除某个person的某辆car

/**
* 设置删除按钮
*
*/
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ if (editingStyle == UITableViewCellEditingStyleDelete){ Car *car = self.carArray[indexPath.row]; NSLog(@"car.id--%@,own_id--%@",car.car_id,car.own_id);
[[DataBase sharedDataBase] deleteCar:car fromPerson:self.person];
self.carArray = [[DataBase sharedDataBase] getAllCarsFromPerson:self.person]; [self.tableView reloadData]; } }

3).修改数据
修改person的name 与 age

更新person.png
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

//    /****************跳转页面 查看car***************/
// PersonCarsViewController *pcvc = [[PersonCarsViewController alloc] init];
// pcvc.person = self.dataArray[indexPath.row];
//
// [self.navigationController pushViewController:pcvc animated:YES];
// /****************person的更新操作***************/ Person *person = self.dataArray[indexPath.row]; person.name = [NSString stringWithFormat:@"%@",person.name]; person.age = arc4random_uniform(100) + 1;
[[DataBase sharedDataBase] updatePerson:person]; self.dataArray = [[DataBase sharedDataBase] getAllPerson]; [self.tableView reloadData]; }

4).查看数据

查看所有数据.png
self.dataArray = [[DataBase sharedDataBase] getAllPerson];

    for (int i = 0 ; i < self.dataArray.count; i++) {
Person *person = self.dataArray[i];
NSMutableArray *carArray = [[DataBase sharedDataBase] getAllCarsFromPerson:person];
[self.carArray addObject:carArray]; }

以上便是通过FMDB对对象数据进行了有效的保存,同时使用单例能够很方便的在各个控制器进行数据的操作,希望这个demo能够帮到大家快速的使用FMDB进行数据的储存操作。(^__^)

作者:MisterBooo
链接:http://www.jianshu.com/p/54e74ce87404
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

FMDB的使用方法(附Demo)的更多相关文章

  1. Quartz在.Net网站中的使用方法(附Demo)

    现在做一个B/S项目需要用到计划任务,本来想自定写一个的,写了几句,突然想看看网上有没有现成可以用的.结果在苦寻之下找到了Quartz这个组件.看过之后感觉还不错.决定用它实现计划任务了.再找找看有没 ...

  2. 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)

    转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...

  3. C#开发微信公众平台-就这么简单(附Demo)转载

    C#开发微信公众平台-就这么简单(附Demo)  来源:https://www.cnblogs.com/xishuai/p/3625859.html#!comments 写在前面 阅读目录: 服务号和 ...

  4. Android 浮动窗口进阶——画中画,浮动视频(附Demo)

    今天继续上一篇Android顶层窗口.浮动窗口的进阶应用.上一篇主要讲解了WindowManager服务和如何使用WindowManager编写一个顶层窗口.今天主要是讲讲如何在顶层窗口里面播放视频, ...

  5. C#版清晰易懂TCP通信原理解析(附demo)

    [转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...

  6. Vue插件编写、用法详解(附demo)

    Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...

  7. 开源分享:谷歌大佬联合打造《高级Kotlin强化实战(附Demo)》

    Kotlin 以其简洁的特性而闻名,而在我们的实践中,更加简洁就意味着更加高效.事实上,在使用 Kotlin 的专业 Android 开发者中,有多达 67% 的人表示 Kotlin 已经帮助他们提升 ...

  8. 基于socket的客户端和服务端聊天简单使用 附Demo

    功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听L ...

  9. Asp.net MVC集成Google Calendar API(附Demo源码)

    Asp.net MVC集成Google Calendar API(附Demo源码) Google Calendar是非常方便的日程管理应用,很多人都非常熟悉.Google的应用在国内不稳定,但是在国外 ...

随机推荐

  1. JavaScript代码放在HTML代码不同位置的差别

    通常情况下,JavaScript 代码是和 HTML 代码一起使用的,可以将 JavaScript 代码放置在 HTML 文档的任何地方.但放置的地方,会对 JavaScript 代码的正常执行会有一 ...

  2. HDU - 1869 六度分离 Floyd多源最短路

    六度分离 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即 ...

  3. C#—反射(反射类型、方法、构造函数、属性、实现可配置可扩展、数据库访问类反射封装)

    反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对象,即使 ...

  4. 讨论:研发团队到底应该是制定OKR还是制定KPI?

    在讨论之前我们先来了解两个概念: 一.KPI KPI是一套绩效管理的方法.全称为:Key Performance Indicator.中文叫:关键绩效指标. KPI,和我们的“任务分解”不同.任务分解 ...

  5. unite2017《Unity企业级支持案例与分析》

    在今天举办的Unite2017开发者大会上,Unity大中华区技术支持总监张黎明以"Unity企业级支持案例与分析"为主题进行了分享. 以下为演讲实录: 张黎明:非常感谢大家来参加 ...

  6. tableview中用动画效果改变cell的高度

    我们要的效果大概就是如下效果: 当我们选择一个cell的时候,我们就要改变它的高度,并且以动画的形式. 我们该如何实现这个效果呢?我们主要需要使用以下这两个方法: - (CGFloat)tableVi ...

  7. react-native-syan-image-picker的使用

    传送门 第一种方式:link 第一步:安装 1.  npm install react-native-syan-image-picker --save 2.  react-native link re ...

  8. HTML+CSS注意点

    1. 对于中文网页,需要在header中使用<meta charset="utf-8">声明编码,否则会出现乱码. 2. 属性 属性 描述 class 为html元素定 ...

  9. 3、CreateJS介绍-SoundJS

    需要在html5文件中引入的CreateJS库文件是soundjs-0.5.2.min.js HTML5文件如下: <!DOCTYPE html> <html lang=" ...

  10. [SDOI2013]随机数生成器

    Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意 ...