iOS下的dao層實現代碼

來源:互聯網
上載者:User

標籤:開發模式   ios   物件導向   資料庫   繼承   

iOS下的dao層實現代碼什麼是dao層

DAO (Data Access Object) Data Access Objects是一個物件導向的介面. 直接操作資料庫, 針對資料的增添,刪除,修改,尋找,具體為商務邏輯層或展示層提供資料服務.

一個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 = '科魯茲'"];}

iOS下的dao層實現代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.