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

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 
#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模式在数据库的运用)