zoukankan      html  css  js  c++  java
  • [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!

  • 相关阅读:
    SpringBoot是如何动起来的
    Windows 10 安装 Docker for Windows
    Spring Boot2.0 设置拦截器
    修改博客园的css样式
    Spring-Aop
    Java自学-泛型 集合中的泛型
    Java自学-集合框架 聚合操作
    Java自学-集合框架 Comparator和Comparable
    Java自学-集合框架 hashCode原理
    Java自学-集合框架 HashSet、LinkedHashSet、TreeSet之间的区别
  • 原文地址:https://www.cnblogs.com/ybw123321/p/5404963.html
Copyright © 2011-2022 走看看