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 <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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,567评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,424评论 25 707
  • 昨天杨幂最新的一组写真刷爆了各大平台,写真中杨幂女神长发披肩,毛料短裙搭配墨绿色格子毛衣,十足的文艺范,不管是坐着...
    绘享瘦阅读 804评论 0 0
  • 看朋友圈时看到这样一句话:“事,看透了伤神,人,看透了伤心。”
    苗二丫头阅读 189评论 0 0
  • 带着这个年纪的姑凉没有的重量,严重和沉重的数字。我觉得我自己有淘宝选择恐惧症,(在淘宝浪费太多时间)感觉自己确实有...
    陈尘H阅读 169评论 1 3