2013-10-30 30 views
0

我想從empId,Name,deptId作爲屬性的'Employee'Entity獲取數據。將ManagedObject轉換爲NSObject

// Used to Populate data in table 
Employee : NSObject 

@property (nonatomic, retain) NSString *name; 
@property int empId; 
@property int deptId; 

@synthesize empId, name, deptId; 

&

CDEmployee : NSManagedObject 

@property (nonatomic, retain) NSString *name; 
@property int empId; 
@property int deptId; 
- (void)convertMyData:(Employee *)emp; 

@dynamic empId, name, deptId; 

- (void)convertMyData:(Employee *)emp 
{ 
self.empId = emp.empId; 
self.name = emp.name; 
self.deptId = emp.deptId; 
} 


// My code to fetch & convert data retured from db to Employee class 
-(NSArray *)getAllEmployees:(NSManagedObjectContext*)context 
{ 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(empId > %@)",[NSNumber numberWithInt:-1],[NSNumber numberWithInt:1]]; 
     NSFetchRequest* req = [self createRequest:context]; // Request is correct 
     [req setPredicate:predicate]; 
     NSFetchedResultsController* fetchContr = [[NSFetchedResultsController alloc] initWithFetchRequest:req managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 

     NSError* error = nil; 
     [fetchContr performFetch:&error]; 

     NSArray *fetchedObjects = [fetchContr fetchedObjects]; 
     NSMutableArray *result = [[[NSMutableArray alloc] init] autorelease]; 

     for(int i = 0; i < [fetchedObjects count]; i++) 
     { 
      CDEmployee *cdEmp = [[fetchedObjects objectAtIndex:i] retain]; // just tried retaing 

      if (cdEmp) 
      { 
       Employee *emp = [[Employee alloc] init]; 

       NSLog(@"Employee - %@", emp); // Shows tht is has object 
       [cdEmp convertMyData:emp]; //-----> Crashing here 

       [result addObject:emp]; 
       [emp release]; 
      } 
     } 
     [fetchContr release]; 
     return result; 
} 

我從核心數據&我得到正確的結果回來取結果,但是當我將我的核心數據結果回到Employee(NSObject)類我得到[NSManagedObject convertMyData:]:無法識別的選擇發送舉例來說。

我嘗試添加另一種方法說-(void)helloWorldCDEmployee類&試圖[cdEmp helloWorld];但得到了同樣的崩潰。

沒有得到它爲什麼導致問題。我有方法定義&在適當的地方執行&它甚至沒有在編譯時給我警告。

回答

0

以下是將NSManagedObject轉換爲NSDictionary的示例代碼。

NSDictionaryNSObject更容易處理和操作數據。另請參閱此Git Library以獲取其他類似的iOS實用程序類方法。

+(NSDictionary *)convertManagedObjectToDictionary:(NSManagedObject *)managedObject{ 

    if (!managedObject){ 
     NSLog(@"Managed object is nil"); 
     return nil; 
    } 
    else{ 

     unsigned int objectsCount; 
     objc_property_t *objectProperties = class_copyPropertyList([managedObject class], &objectsCount); 

     NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; 
     for(int i = 0; i < objectsCount; i++) { 
      objc_property_t property = objectProperties[i]; 
      NSString *name = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; 
      id object = [managedObject valueForKey:name]; 
      [dictionary setObject:((object == nil) ? [NSNull null] : object) forKey:name]; 
     } 
     free(objectProperties); 
     return dictionary; 
    } 
} 
+0

錯字嘗試 - 應該是'如果(managedObject!)'... – Mundi

+0

managedObject我想過去不爲空,但是,我m到處objectProperties爲NULL&objectsCount爲0是這意味着我的managedObject是空的。我做什麼 – JiteshW

+0

Jitesh - 希望你已經糾正了我的錯字,正如Mundi提到的 – thatzprem

-1

首先,您應該首先考慮您想從非技術角度完成的任務。實際上是什麼?

二,NSManagedObjectNSObject的一個子類,這意味着你已經有一個NSObject。恭喜,你完成了!

此外,在您的代碼中,您可以撥打fetchMyData,但未向我們展示您定義它的位置或代碼的外觀。也許NSManagedObject類別會在這裏?但是,這仍然會引起你爲什麼要這麼做的問題。即使您要轉換爲基礎對象,如其他答案中建議的NSDictionary,您仍然會遇到建模關係問題...

最後,您使用的是哪個SDK?如果你還沒有使用ARC,你不會認真的。

+0

「NSManagedObject」始終依賴於上下文。例如,如果您有一個上下文並嘗試通過各種線程傳遞託管對象,則應用程序可能會崩潰。 –