将 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)helloWorld
到 CDEmployee
类并尝试 [cdEmp helloWorld];
但遇到了同样的崩溃。
不明白为什么会导致问题。我已经在适当的地方定义和实现了方法,它甚至没有在编译时给我警告。
【问题讨论】:
【参考方案1】:这是一个将NSManagedObject
转换为NSDictionary
的示例代码。
NSDictionary
比NSObject
更容易处理和操作数据。另请参阅此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】:首先,您应该首先从非技术角度考虑您想要完成什么。实际上是什么?
其次,NSManagedObject
是NSObject
的子类,这意味着您已经有一个NSObject
。恭喜你,你完成了!
此外,在您的代码中,您调用了fetchMyData
,但没有向我们展示您定义它的位置或代码的样子。也许NSManagedObject
category 会在这里有序?但是,这仍然引出了你为什么要这样做的问题。即使您要转换为 Foundation 对象,如另一个答案中所建议的 NSDictionary
,您仍然会遇到建模关系的问题...
最后,您使用的是什么 SDK?如果您仍然不使用 ARC,您就不能认真。
【讨论】:
NSManagedObject
始终依赖于上下文。这意味着例如,如果您有一个上下文并尝试通过各种线程传递托管对象 - 应用程序可能会崩溃。以上是关于将 ManagedObject 转换为 NSObject的主要内容,如果未能解决你的问题,请参考以下文章
将 managedobject 从 uitableview 传递到文本字段以在核心数据模型中进行编辑
核心数据:使用新创建的 ManagedObject 转至细节控制器
iPad --- [self.tableViewSection reloadData] 时的 managedObject 问题