iOS下的dao层实现代码

iOS下的dao层实现代码

什么是dao层

DAO (Data Access Object) 数据访问对象是一个面向对象的接口. 直接操作数据库, 针对数据的增添,删除,修改,查找,具体为业务逻辑层或表示层提供数据服务.

一个dao的例子

- (void)saveRemind:(RemindEntity *)remind; // 保存一个提醒
- (void)deleteRemindWithWhere:(NSString *)where; // 删除一个提醒
- (RemindEntity *) loadRemindWithRemindID:(NSString *)rid; // 读取一个提醒
- (void)deleteRemindWithRemindID:(NSString *)rid; // 删除一个提醒
- (void)deleteRemindWithWeihuaId:(NSString *)weihuaId rcdId:(int)rcdId; // 删除一个联系人或者微话好友的提醒
- (NSArray *)searchRemindWithWhere:(NSString *)where
                            order:(NSString *)order
                            limit:(NSString *)limit; // 查找提醒
- (NSInteger)remindCountWithWhere:(NSString *)where; // 返回提醒数量
- (NSArray *)allArrivalReminds; // 返回所有未过期, 下次开始时间小于现在时间的提醒
- (NSArray *)allNonOverdueReminds; // 返回所有未过期的提醒
+ (void) setupDB; // 初始化数据库

内部实现是用fmdb,得写大量的sql.如果我们有多个实体类, 就得写多个dao.

范化的dao

下面我们来看一个范化的dao, 就不用为每个实体专门写sql了,具体使用的时候可以继承这个类或者写个工厂类.

@protocol XYBaseDaoEntityProtocol <NSObject>

@required
// 返回表名
+ (NSString *)getTableName;

// 返回主键
+ (NSString *)getPrimaryKey;

@end

// 范化的本地dao类
@interface XYBaseDao : NSObject

@property (nonatomic, weak, readonly) Class entityClass;

+ (instancetype)daoWithEntityClass:(Class)aClass;

- (NSError *)saveEntity:(id)entity;
- (NSError *)saveEntityWithArray:(NSArray *)array;

- (id)loadEntityWithKey:(NSString *)key;
- (NSArray *)loadEntityWithWhere:(NSString *)where;

- (NSInteger)countWithWhere:(NSString *)where;

- (NSError *)deleteEntityWithKey:(NSString *)key;
- (NSError *)deleteEntityWithWhere:(NSString *)where;

- (void)deleteAllEntity;

@end

这个dao是基于LKDBHelper的, 把实体对象的类当初始化参数传进去.

+ (instancetype)daoWithEntityClass:(Class)aClass
{
    XYBaseDao *dao = [[[self class] alloc] initWithEntityClass:aClass];

    return dao;
}

- (instancetype)initWithEntityClass:(Class)aClass
{
    self = [super init];
    if (self)
    {
        _entityClass = aClass;
        _globalHelper = [LKDBHelper getUsingLKDBHelper];
        // 创建表
        [_globalHelper createTableWithModelClass:[_entityClass class]];
    }
    return self;
}
- (NSError *)saveEntity:(id)entity
{
    if (entity == nil)
        return [NSError errorWithDomain:[NSString stringWithFormat:@"[save error] :%@", entity] code:XYBaseDao_error_code userInfo:nil];

    LKDBHelper *globalHelper = [LKDBHelper getUsingLKDBHelper];

    if (![globalHelper insertToDB:entity])
    {
        return [NSError errorWithDomain:[NSString stringWithFormat:@"[save error] :%@", entity] code:XYBaseDao_error_code userInfo:nil];
    }

    return nil;
}
- (NSError *)saveEntityWithArray:(NSArray *)array
{
    if (array == nil || array.count == 0)
        return [NSError errorWithDomain:[NSString stringWithFormat:@"[save error] :%@", array] code:XYBaseDao_error_code userInfo:nil];

    NSMutableString *str = [NSMutableString stringWithFormat:@"[save error] :"];
    NSInteger length = str.length;

    __weak __typeof(XYBaseDao *) weakSelf = self;

    //事物  transaction
    [_globalHelper executeDB:^(FMDatabase *db) {
        [db beginTransaction];
        for (NSObject *entity in array)
        {
            if (![weakSelf.globalHelper insertToDB:entity])
            {
                [str stringByAppendingFormat:@"%@ ", entity];
            }
        }
        [db commit];
    }];

    if (str.length > length)
    {
        return [NSError errorWithDomain:str code:XYBaseDao_error_code userInfo:nil];
    }

    return nil;
}
- (id)loadEntityWithKey:(NSString *)key
{
    if (key.length == 0)
        return nil;

    id object = [[_entityClass alloc] init];

    NSString *where = nil;

    if ([key isKindOfClass:[NSString class]])
    {
        where = [NSString stringWithFormat:@"%@ = '%@'", [_entityClass getPrimaryKey], key];
    }
    else if ([key isKindOfClass:[NSNumber class]])
    {
        where = [NSString stringWithFormat:@"%@ = %@", [_entityClass getPrimaryKey], key];
    }
    else if (1)
    {
#pragma mark- todo  多主键种类判断
        where = @"";
    }

    object = [_entityClass searchSingleWithWhere:where orderBy:nil];

    return object;
}
- (NSArray *)loadEntityWithWhere:(NSString *)where
{
    if (where.length == 0)
        return nil;

    NSArray *array = [_entityClass searchWithWhere:where orderBy:nil offset:0 count:XYBaseDao_load_maxCount];

    return array;
}
- (NSInteger)countWithWhere:(NSString *)where
{
    return [_entityClass rowCountWithWhere:where];
}
- (NSError *)deleteEntityWithKey:(NSString *)key
{
    id object = [[_entityClass alloc] init];
    [object setValue:key forKey:[_entityClass getPrimaryKey]];

    if (![object deleteToDB])
    {
        return  [NSError errorWithDomain:[NSString stringWithFormat:@"[delete error] : %@ %@", _entityClass, key] code:XYBaseDao_error_code userInfo:nil];
    }

    return nil;
}
- (NSError *)deleteEntityWithWhere:(NSString *)where
{
    if (![_entityClass deleteWithWhere:where])
    {
        return  [NSError errorWithDomain:[NSString stringWithFormat:@"[delete error] : %@ %@", _entityClass, where] code:XYBaseDao_error_code userInfo:nil];
    }

    return nil;
}
- (void)deleteAllEntity
{
    [LKDBHelper clearTableData:[_entityClass class]];
}

最后是demo

- (void)clickTestDao:(id)sender
{
    XYBaseDao *dao = [XYBaseDao daoWithEntityClass:[CarEntity class]];
    [dao deleteAllEntity];

    CarEntity *car = [[CarEntity alloc] init];
    car.name = @"a";
    car.brand = @"科鲁兹";
    car.time = 1;

    [dao saveEntity:car];

    CarEntity *car2 = [[CarEntity alloc] init];
    car2.name = @"b";
    car2.brand = @"科鲁兹";
    car2.time = 1;

    CarEntity *car3 = [[CarEntity alloc] init];
    car3.name = @"c";
    car3.brand = @"福克斯";
    car3.time = 1;

    CarEntity *car5 = [[CarEntity alloc] init];
    car5.name = @"d";
    car5.brand = @"高尔夫";
    car5.time = 1;

    NSArray *array = @[car2, car3, car5];

    [dao saveEntityWithArray:array];

    CarEntity *car4 = [dao loadEntityWithKey:@"c"];
    NSLog(@"%@", car4);

    NSArray *array2 = [dao loadEntityWithWhere:@"brand = '科鲁兹'"];
    NSLog(@"%@", array2);

    NSInteger count = [dao countWithWhere:nil];
    NSLog(@"%d", count);

    [dao deleteEntityWithKey:@"c"];
    [dao deleteEntityWithKey:@"brand = '科鲁兹'"];
}
时间: 2024-08-28 22:27:17

iOS下的dao层实现代码的相关文章

编写hibernate 操作数据库的dao层简单代码

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

DAO 层实现

一.实验介绍 1.1 实验内容 本节课程主要利用 MyBatis 框架实现 DAO 层. 1.2 实验知识点 MyBatis 框架 MySQL 1.3 实验环境 JDK1.8 Eclipse JavaEE 二.实验步骤 根据第一节,我们可以知道系统的功能包括了哪些,根据第三节和第四节,我们知道了数据库表的结构和持久化实体,因此,在这里我们完成数据库的访问操作. 首先在项目 hrms 的 Java Resources 目录的 src/main/java 下新建包 com.shiyanlou.dao

Spring框架之使用JdbcTemplate开发Dao层程序

简介: JdbcTemplate开发dao层程序     由Spring框架给我们提供,Spring提供的很多操作数据源(关系型数据库,二维表格模型,有明确的行和列(mysql/orcal等) 非关系型数据库(redis.mongodb)NoSQL)消息列(activeMq,jms)的小工具 JdbcTemplate操作关系数据库 RedisTemplate操作redis JmsTtemplate操作消息队列 JdbcTemplate类 使用方法和QueryRunner基本一致. 构造方法传递数

java web项目DAO层通用接口BaseDao与实现类BaseDaoImpl

在spring+hibernate的web项目中,处理数据层通常会使用Spring框架提供的HibernateTemplate类提供的方法.通常的用法是每一个实体类对应的去写DAO层的接口和实现类.每个实现类中都写hibernateTemp.save(entity).hibernateTemp.update(entity).hibernateTemp.get(id)...这样写固然没错,但存在着大量的重复代码.所以懒惰的程序员烦了,他们要写一个通用的实现类来解决这个问题,让DAO层解放出来.如果

dao层实现类的常见写法

记录下一个dao层类的写法,方便以后的使用. 1 package com.bupt.auth.dao.impl; 2 3 import java.util.ArrayList; 4 import java.util.HashSet; 5 import java.util.List; 6 import java.util.Set; 7 import java.util.concurrent.CopyOnWriteArraySet; 8 9 import org.springframework.st

biz处理dao层的事务

前言 正文 1.创建一个事物管理对象,该对象将连接对象绑定到当前线程 2.dao层的代码示例 3.biz层处理数据库的事务 总结 biz处理dao层的事务

【DRP】-Dao层常用功能代码:增删改查

本系列博客内容为:做DRP系统中Dao层常用功能. 该项目采用MVC架构 C(Controller)控制器,主要职责;1.取得表单参数:2.调用业务逻辑:3.转向页面 M(Model)模型,主要职责:1.业务逻辑:2.保存数据的状态 V(View)视图,主要职责:显示 本文主要是针对于Dao层的常见使用方法:增删改查sql语句及常用操作. 1 package com.bjpowernode.drp.basedata.dao; 2 3 import java.sql.Connection; 4 i

一行代码解决ios下局部滚动干涩问题

全局滚动: body自身的滚动就是全局滚动,在ios下这样的滚动很流畅. 局部滚动:body下的dom滚动就是局部滚动,在ios下这样的滚动感觉比较干涩. 解决方法: 在滚动的dom上加上以下代码: selector { -webkit-overflow-scrolling: touch; } 建议加在body上,这样子标签都会继承这条属性.

iOS下用一行代码实现tableview(collectionview)的parallax效果

效果和https://github.com/jberlana/JBParallaxCell一样.实现cell的滚动视差. 原理很简单,就是一个等比公式  cell的图片位置 / cell图片可以滑动的总长 = cell在table中的位置 / cell 可滑动总长  实现方法: 1> 在cell的UIImageView上添加父视图UIView,clipsToBounds设置为yes,用来剪切UIImageView,为其限定大小. 2>在vc的 -(void)scrollViewDidScrol