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