0

我正在尝试从具有 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];,但遇到了同样的崩溃。

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

4

3 回答 3

0

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

于 2013-10-31T07:11:51.430 回答
0

这是一个转换NSManagedObjectNSDictionary.

NSDictionary比 . 更容易处理和操作数据NSObject。另请参阅此Git 库以了解其他类似的 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;
    }
}
于 2013-10-30T08:25:56.247 回答
-1

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

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

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

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

于 2013-10-30T09:28:13.233 回答