将 ManagedObject 转换为 NSObject

Posted

技术标签:

【中文标题】将 ManagedObject 转换为 NSObject【英文标题】:Converting ManagedObject to NSObject 【发布时间】:2013-10-30 07:23:00 【问题描述】:

我正在尝试从具有 empId、Name、deptId 作为属性的“员工”实体中获取数据。

// 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]; 但遇到了同样的崩溃。

不明白为什么会导致问题。我已经在适当的地方定义和实现了方法,它甚至没有在编译时给我警告。

【问题讨论】:

【参考方案1】:

这是一个将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;
    

【讨论】:

我传递的 managedObject 不为空,但是,我将 objectProperties 设为 NULL 和 objectsCount 为 0,这意味着我的 managedObject 为空。我该怎么办 @thatzprem 您也应该在存储库中更正它。【参考方案2】:

我尝试了不同的方式并得到了解决http://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started

【讨论】:

【参考方案3】:

首先,您应该首先从非技术角度考虑您想要完成什么。实际上是什么?

其次,NSManagedObjectNSObject 的子类,这意味着您已经有一个NSObject。恭喜你,你完成了!

此外,在您的代码中,您调用了fetchMyData,但没有向我们展示您定义它的位置或代码的样子。也许NSManagedObject category 会在这里有序?但是,这仍然引出了你为什么要这样做的问题。即使您要转换为 Foundation 对象,如另一个答案中所建议的 NSDictionary,您仍然会遇到建模关系的问题...

最后,您使用的是什么 SDK?如果您仍然不使用 ARC,您就不能认真。

【讨论】:

NSManagedObject 始终依赖于上下文。这意味着例如,如果您有一个上下文并尝试通过各种线程传递托管对象 - 应用程序可能会崩溃。

以上是关于将 ManagedObject 转换为 NSObject的主要内容,如果未能解决你的问题,请参考以下文章

保存后 ManagedObject 的上下文为零

将 managedobject 从 uitableview 传递到文本字段以在核心数据模型中进行编辑

核心数据:使用新创建的 ManagedObject 转至细节控制器

iPad --- [self.tableViewSection reloadData] 时的 managedObject 问题

为啥existingObjectWithID 保存后会返回一个带temporaryID 的managedObject?

ManagedObject 和 ObservedObject