美文网首页
iOS中DAO模式在数据库的运用

iOS中DAO模式在数据库的运用

作者: LennonLin | 来源:发表于2016-01-28 20:06 被阅读804次

    iOS中DAO模式在数据库的运用

    DAO(Data Access Object 数据接口)模式可以作为数据持久化的设计,实行CRUD增加(Create)、重新取得数据(Retrieve)、更新(Update)和删除(Delete)

    J2EE(Java Platform Enterprise Edition),Java平台企业。Java平台共分的版本是Java EE、Java SE、和Java ME.DAO模式是标准的J2EE设计模式之一,是将底层数据访问操作与高级业务逻辑分离,一个典型DAO模式实现是一下的组件
    1.一个DAO工厂类
    2.一个DAO接口
    3.一个实现了DAO接口的具体类
    4.数据传输对象(有时称为值对象)

    实现

    • 利用单例模式封装增查改删(CRUD)的操作数据接口。
    • 利用FMDB第三方库和SQLite语句
    • 在初始化中要从Bundle拷贝到沙盒的Documents下,相当于App本身文件不会再消失
    • 以对象为单位来组织数据。

    在MVC架构中例子

    • 比方说有SQLite的两个关系型数据库员工和部门,那么我们而已给这个两个数据模型分别写两个类形成一个持久层,对每一个类写成单例模式,并且封装数据库增删改查的接口。来实现给Controller瘦身。

    MVC中的网络数据请求可以封装成一个服务层,来操作网络请求或下载。

    员工数据库DAODemo

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
        // 在程序第一次运行时将数据库文件从应用程序的Bundle拷贝到沙盒
        if (![userDef boolForKey:@"initialized"]) {
            NSError *error = nil;
            // 源文件是应用程序Bundle中的数据库文件
            NSString *srcPath = [[NSBundle mainBundle] pathForResource:@"company.db" ofType:nil];
            // 目标文件是应用程序沙盒的Documents文件夹下的同名文件
            NSString *dstPath = [NSString stringWithFormat:@"%@/Documents/company.db", NSHomeDirectory()];
            if ([[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:dstPath error:&error]) {
                // 如果拷贝成功表示应用程序已经完成初始化
                // 将用户偏好设置中的initialized属性赋值为YES
                [userDef setBool:YES forKey:@"initialized"];
                [userDef synchronize];
            }
            else {
                NSLog(@"%@", error);
            }
        }
        
        return YES;
    }
    
    
    #import <Foundation/Foundation.h>
    #import "FMDB.h"
    
    @class LXKEmp,LXKDept;
    
    @interface LXKEmpDao : NSObject {
        FMDatabase *_db;
    }
    
    + (instancetype) sharedDao;
    
    - (NSArray *) findByDept:(LXKDept *) dept;
    
    - (BOOL) add:(LXKEmp *) emp;
    
    - (BOOL) remove:(LXKEmp *) emp;
    
    - (LXKEmp *) findByEmpNo:(NSUInteger) no;
    
    @end
    
    #import "LXKEmpDao.h"
    #import "LXKDept.h"
    #import "LXKEmp.h"
    
    @implementation LXKEmpDao
    
    - (void) dealloc {
        [_db close];
        _db = nil;
    }
    
    - (instancetype)init {
        @throw [NSException exceptionWithName:@"" reason:@"不能通过此方法初始化" userInfo:nil];
    }
    
    - (instancetype)initPrivate {
        if (self = [super init]) {
            NSString *dbFilePath = [NSString stringWithFormat:@"%@/Documents/company.db",NSHomeDirectory()];
            _db = [FMDatabase databaseWithPath:dbFilePath];
        }
        return self;
    }
    
    + (instancetype)sharedDao {
        static LXKEmpDao *instance = nil;
        static dispatch_once_t onceToken;
        // 直接敲dispatch选择snippet代码片段就出来了
        dispatch_once(&onceToken, ^{
            if (!instance) {
                instance = [[self alloc] initPrivate];
            }
        });
        return instance;
    }
    
    - (LXKEmp *) createEmpWithResultSet:(FMResultSet *) rs {
        LXKEmp *emp = [[LXKEmp alloc] init];
        emp.no = [rs intForColumn:@"empno"];
        emp.name = [rs stringForColumn:@"ename"];
        emp.job = [rs stringForColumn:@"job"];
        LXKEmp *manager = [[LXKEmp alloc] init];
        manager.no = [rs intForColumn:@"mgr"];
        emp.manager = manager;
        emp.salary = [rs intForColumn:@"sal"];
        LXKDept *dept = [[LXKDept alloc] init];
        dept.no = [rs intForColumn:@"dno"];
        emp.dept = dept;
        emp.photo = [rs dataForColumn:@"photo"];
        return emp;
    }
    
    - (NSArray *) findByDept:(LXKDept *) dept {
        NSMutableArray *mArray = [NSMutableArray array];
        FMResultSet *rs = [_db executeQuery:@"select * from TbEmp where empno=?",@(dept.no)];
        while ([rs next]) {
            [mArray addObject:[self createEmpWithResultSet:rs]];
        }
        [rs close];
        return [mArray copy];
    }
    
    - (BOOL) add:(LXKEmp *) emp {
        return [_db executeQuery:@"insert into TbEmp values(?,?,?,?,?,?,?)",@(emp.no),emp.name,emp.job,@(emp.manager.no),@(emp.salary),@(emp.dept.no),emp.photo];
    }
    
    - (BOOL) remove:(LXKEmp *) emp {
        return [_db executeUpdate:@"delete from TbEmp where empno=?",@(emp.no)];
    }
    
    - (LXKEmp *) findByEmpNo:(NSUInteger) no {
        LXKEmp *emp = nil;
        FMResultSet *rs = [_db executeQuery:@"select * from TbEmp where empno=?",@(no)];
        if ([rs next]) {
            [self createEmpWithResultSet:rs];
        }
        return emp;
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:iOS中DAO模式在数据库的运用

          本文链接:https://www.haomeiwen.com/subject/jqdjkttx.html