[OC]数据库的使用--数据读取
接着上一篇博文,现在我们来实现数据库数据的读取~
首先来理下思路(好吧是我懵逼了-_-|||)
实例化一个fmdb对象MyDataManager,用来进行对数据库的操作,创建一个数据模型Model用来存放从数据库读取的数据,ViewController方便从Model读取数据。
step1:
新建一个继承与NSObject的类MyDataManager
step2:
在.h文件中添加如下方法
#import <Foundation/Foundation.h> typedef enum { Uname }DataType; @interface MyDataManager : NSObject +(NSArray *)getData:(DataType)type; @end
tip: 这里用+方法,因为这个方法就像一个工具,我们只需要用就可以,不需要实例化。
这里创建了一个叫DataType的枚举对象,用于后面数据库的查找,因为此例很简单,如果数据库有多张表,就可以在枚举中添加其他元素。
step3:
到.m中实现这个方法
#import "MyDataManager.h" #import "FMDatabase.h" #import "ViewModel.h" @implementation MyDataManager +(NSArray *)getData:(DataType)type{ static FMDatabase *dataBase;//数据库管理对象 NSMutableArray *array = [[NSMutableArray alloc]init]; //判断dataBase是否为nil if (dataBase==nil) { //获取数据库文件路径 NSString *path = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"db"]; //dataBase初始化 dataBase=[[FMDatabase alloc]initWithPath:path]; } //dataBase有个open方法,返回一个布尔值,判断是否打开成功 if ([dataBase open]) { NSLog(@"dataBase open success"); }else{ NSLog(@"open failed"); return array;//打开失败操作不再进行 } //数据库查找,根据type查找不同语句,根据不同的type查询不同的表 switch (type) { case Uname: { //数据库查询语句 NSString *sql = @"select num,name FROM name"; //查询结果的对象 FMResultSet *rs = [dataBase executeQuery:sql];
//FMResultSet对象有一个next方法,返回为1说明后面还有元素,遍历查询结果 while ([rs next]) { //创建一个数据模型的对象 ViewModel *model = [[ViewModel alloc]init]; //接收,根据不同数据类型用相应类型接收 model.num=[NSString stringWithFormat:@"%d",[rs intForColumn:@"num"]];
//因为此处model里的num为NSString类型,所以要用一个格式化字符串 model.name=[rs stringForColumn:@"name"]; //把结果加到数组中 [array addObject:model]; } } break; default: break; } return array; } @end
这里就要添加一个模型对象了~
step4:
添加一个继承与NSObject的ViewModel
我们的数据库有两个值,一个是num一个是name,那么我们在.h文件中就创建两个对象,用于存储从数据库读取到的这两个值:
@property(nonatomic,copy)NSString *num; @property(nonatomic,copy)NSString *name;
从MyDataManager.m中我们不难看出,+(NSArray *)getData:(DataType)type,返回的是一个model组成的数组(其他地方通过调用这个方法,读取这个数组,读取里面的model,取得model里面的东西,就实现了数据库数据的读取,好绕啊。。。)。那么接下来我们就要用这个数组为我们的tableView填充数据。
step5:
刚才说了我们需要调用getData类方法实现数据库的读取,所以在ViewController里别忘了导入MyDataManager的头文件,然后需要把从数据库读取的数据转化为可用的类型,需要用Model,所以,别忘了ViewModel的头文件。
在ViewController.h中我们创建一个数组变量,用来存放getData方法返回的数组:
@property(nonatomic,copy)NSArray *dataArray;
在viewDidLoad里初始化这个数组
_dataArray = [MyDataManager getData:Uname];
看!这里用到了Uname!因为我们这里只有一张表,没体现这个东西。正常情况下我们要用到的数据库不会只有一张表,多张表的话,我们就用这个DataType判断现在需要查看的是哪张表,只要在枚举里加其他元素就OK了,是不是扩展性很好呢~
step6:
把numberOfRowsInSection返回的固定值改成dataArray的对象数量:
return _dataArray.count;
cell的内容也要做相应的更改:
ViewModel *model = _dataArray[indexPath.row]; cell.textLabel.text = model.num;
return cell;
没忘吧,getData返回的是一个由model组成的数组,所以这里_dataArray也是一个由model组成的数组。这里实例化了一个model,让cell里面的textLabel通过这个model取得需要的值~
step7:
测试一下吧~
step8:
都运行成功了,哪来的step8!