将ManagedObject转换为NSObject

时间:2013-10-30 07:23:00

标签: iphone core-data nsmanagedobject unrecognized-selector

我正在尝试从'Employee'实体获取数据,其中包含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;
}

我从核心数据中获取结果&amp;我收到了正确的结果,但是当我将核心数据结果转换回Employee(NSObject)类时,我将 [NSManagedObject convertMyData:]:无法识别的选择器发送到实例。

我尝试将另一种方法-(void)helloWorld添加到CDEmployee课程&amp;尝试了[cdEmp helloWorld];,但遇到了同样的崩溃。

没有理由导致问题。我有方法定义&amp;在适当的地方实施它甚至没有在编译时向我发出警告。

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

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

此外,在您的代码中,您调用了fetchMyData,但没有告诉我们您在何处定义它或代码是什么样的。也许这里有NSManagedObject 类别?但是,这仍然是为什么你想要这样做的问题。即使您要转换为基础对象,例如另一个答案中建议的NSDictionary,您仍然会遇到建模关系的问题......

最后,您使用的是什么SDK?如果您还没有使用ARC,则不能认真对待。