Objective-C中ORM的運用:實體物件和字典的相互自動轉換

來源:互聯網
上載者:User

標籤:

http://blog.csdn.net/cooldragon/article/details/18991973

iOS開發中基於ORM的架構很多,如SQLitePersistentObject,實際開發中需求不同或情境不同,方式方法也就不同,有時項目中用不上ORM架構,或者出於公司或項目組習慣或規範、實際項目需求或技術要求等等原因,不會採用完整的ORM架構,但一些重複囉嗦的代碼使用一定的ORM功能還是很能提高效率的。

基於效能或靈活性考慮,或複雜查詢的需求,或項目組要求,項目中資料庫存取一般直接用SQL或用FMDB的多些(某些產品研髮型另說,軟體架構設計是另一個話題,從筆者N年面試N多iOS開發人員來看用FMDB的佔了極大多數,不乏某某有名App),代碼中使用字典、數組或自訂類(或叫實體)作為資料載體,FMDB的FMResultSet有個resultDictionary能夠直接返回字典NSDictionary,再結合下面的輔助類,能夠解決實體物件和字典(NSDictionary)的相互自動轉換問題,不用一個Key一個Key,一個屬性一個屬性的自己去寫代碼了,避免重複手寫煩雜和拼字錯誤的可能,大大的提高了開發效率。

 

[objc] view plaincopy 
  1. //  
  2. //  EntityHelper.h  
  3. //  使用前提條件是:字典的Key和實體物件屬性的單詞是一樣的,大小可以忽略。  
  4. //  
  5. //  Created by LongJun on 13-1-28.  
  6. //  Copyright (c) 2013年 RL. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. @interface EntityHelper : NSObject  
  12.   
  13.   
  14. //字典對象轉為實體物件  
  15. + (void) dictionaryToEntity:(NSDictionary *)dict entity:(NSObject*)entity;  
  16.   
  17. //實體物件轉為字典對象  
  18. + (NSDictionary *) entityToDictionary:(id)entity;  
  19.   
  20. @end  

 

 

[objc] view plaincopy 
  1. //  
  2. //  EntityHelper.m  
  3. //  ARProjectForPad  
  4. //  
  5. //  Created by LongJun on 13-1-28.  
  6. //  Copyright (c) 2013年 RL. All rights reserved.  
  7. //  
  8.   
  9. #import "EntityHelper.h"  
  10. #import <objc/runtime.h>  
  11.   
  12. @implementation EntityHelper  
  13.   
  14. #pragma mark - Custom Method  
  15.   
  16. + (void) dictionaryToEntity:(NSDictionary *)dict entity:(NSObject*)entity  
  17. {  
  18.     if (dict && entity) {  
  19.           
  20.         for (NSString *keyName in [dict allKeys]) {  
  21.             //構建出屬性的set方法  
  22.             NSString *destMethodName = [NSString stringWithFormat:@"set%@:",[keyName capitalizedString]]; //capitalizedString返回每個單字首大寫的字串(每個單詞的其餘字母轉換為小寫)  
  23.             SEL destMethodSelector = NSSelectorFromString(destMethodName);  
  24.               
  25.             if ([entity respondsToSelector:destMethodSelector]) {  
  26.                 [entity performSelector:destMethodSelector withObject:[dict objectForKey:keyName]];  
  27.             }  
  28.               
  29.         }//end for  
  30.           
  31.     }//end if  
  32. }  
  33.   
  34. + (NSDictionary *) entityToDictionary:(id)entity  
  35. {  
  36.       
  37.     Class clazz = [entity class];  
  38.     u_int count;  
  39.       
  40.     objc_property_t* properties = class_copyPropertyList(clazz, &count);  
  41.     NSMutableArray* propertyArray = [NSMutableArray arrayWithCapacity:count];  
  42.     NSMutableArray* valueArray = [NSMutableArray arrayWithCapacity:count];  
  43.       
  44.     for (int i = 0; i < count ; i++)  
  45.     {  
  46.         objc_property_t prop=properties[i];  
  47.         const char* propertyName = property_getName(prop);  
  48.           
  49.         [propertyArray addObject:[NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]];  
  50.           
  51.         //        const char* attributeName = property_getAttributes(prop);  
  52.         //        NSLog(@"%@",[NSString stringWithUTF8String:propertyName]);  
  53.         //        NSLog(@"%@",[NSString stringWithUTF8String:attributeName]);  
  54.           
  55.         id value =  [entity performSelector:NSSelectorFromString([NSString stringWithUTF8String:propertyName])];  
  56.         if(value ==nil)  
  57.             [valueArray addObject:[NSNull null]];  
  58.         else {  
  59.             [valueArray addObject:value];  
  60.         }  
  61.         //        NSLog(@"%@",value);  
  62.     }  
  63.       
  64.     free(properties);  
  65.       
  66.     NSDictionary* returnDic = [NSDictionary dictionaryWithObjects:valueArray forKeys:propertyArray];  
  67.     NSLog(@"%@", returnDic);  
  68.       
  69.     return returnDic;  
  70. }  
  71.   
  72.   
  73. @end  

 


實際使用(邏輯層)樣本:

 

[objc] view plaincopy 
  1. //業務需要返回實體物件  
  2. - (UserSCOInfoEntity*)loadStudyRecord:(UserSCOInfoQuery*)query  
  3. {  
  4.       
  5.     UserSCOInfoEntity *userSCOInfo = nil;  
  6.     @try {  
  7.           
  8.         //  
  9.         NSDictionary *resultDict = [self loadStudyRecordForDict:query];  
  10.         if (!resultDict) return nil;  
  11.         //字典值自動填滿到實體物件屬性  
  12.         [EntityHelper dictionaryToEntity:resultDict entity:userSCOInfo];  
  13.           
  14.     }  
  15.     @catch (NSException *exception) {  
  16.         NSAssert1(0, @"Exception=%@", exception.reason);  
  17.     }  
  18.     @finally {  
  19.     }  
  20.     return userSCOInfo;  
  21. }  
  22.   
  23. //業務需要直接返回字典  
  24. - (NSDictionary*)loadStudyRecordForDict:(UserSCOInfoQuery*)query  
  25. {  
  26.     if (!query || !query.userID || !query.courseID || !query.scoID || !query.type || !query.typeID) {  
  27.         NSAssert(0, @"UserSCOInfoQuery對象或屬性不可為空");  
  28.         return nil;  
  29.     }  
  30.       
  31.     NSDictionary *resultDict = nil;  
  32.     FMDatabase *db = [FMDatabase databaseWithPath:[Common sharedInstance].localMainDb];  
  33.     @try {  
  34.         if (![db open]) {  
  35.             [db release];  
  36.             //NSLog(@"db open fail");  
  37.             return nil;  
  38.         }  
  39.           
  40.         FMResultSet *s = [db executeQuery:@"SELECT … "];  
  41.         while ([s next]) {  
  42.             resultDict = [s resultDictionary];  
  43.             break;  
  44.         }  
  45.         [s close];  
  46.           
  47.         if (!resultDict) {  
  48. //            NSString *errMsg = [db lastErrorMessage];  
  49.             //NSLog(@"[db lastErrorMessage]=%@",errMsg);  
  50.         }  
  51.     }  
  52.     @catch (NSException *exception) {  
  53.         NSAssert1(0, @"Exception=%@", exception.reason);  
  54.     }  
  55.     @finally {  
  56.         [db close];  
  57.     }  
  58.     return resultDict;  
  59. }  



當然,以上代碼有一定應用情境,有一定的局限性,比如:
字典的Key和實體物件屬性的單詞必須是一樣的(大小可以忽略),這裡沒有使用外部對應檔主要也是為了簡化代碼和項目的需要決定的。 

 

Objective-C中ORM的運用:實體物件和字典的相互自動轉換

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.