Core data 将获取的NSManagedObject分配给属性

Core data 将获取的NSManagedObject分配给属性,core-data,nsmanagedobject,nsfetchrequest,stackmob,Core Data,Nsmanagedobject,Nsfetchrequest,Stackmob,这个问题可能看起来很长,但我相信对于核心数据专家来说很简单。显示配置使这个问题变得很长。谢谢 在CoreData中,我有一个用户实体和一个从该实体创建的NSManagedObject子类(User.h/.m)。不确定是否相关,但我正在使用Stackmob的远程数据库 下面是我的获取请求在Review中的外观。m: @interface Review() @property (strong, nonatomic) User *user; @end @sythesize = user; .... i

这个问题可能看起来很长,但我相信对于核心数据专家来说很简单。显示配置使这个问题变得很长。谢谢

在CoreData中,我有一个
用户
实体和一个从该实体创建的
NSManagedObject
子类
(User.h/.m)
。不确定是否相关,但我正在使用Stackmob的远程数据库

下面是我的获取请求在Review中的外观。m:

@interface Review()
@property (strong, nonatomic) User *user;
@end
@sythesize = user;
....
if (fetchedObjects.count>=1)
{
    NSLog(@"Number of Objects Returned %i", fetchedObjects.count);
    NSManagedObject *fetchedObject = [fetchedObjects objectAtIndex:0];
    NSLog(@"fetchObject Object %@", fetchedObject);

    //Addition
    user = (User*)(fetchedObject);
    NSLog(@"User %@", user);
}
获取请求:

-(NSArray *)fetchRequest
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

   //Please Note the line below:
    [fetchRequest setReturnsObjectsAsFaults:NO];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"username == %@", self.usernameField.text];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];

    return fetchedObjects;
}


if (fetchedObjects.count>=1)
        {
            NSLog(@"Number of Objects Returned %i", fetchedObjects.count);
            NSManagedObject *fetchedObject = [fetchedObjects objectAtIndex:0];
        }
以下是日志:

2013-08-18 10:26:25.082 Time[995:c07] Number of Objects Returned 1
2013-08-18 10:26:25.082 Time[995:c07] User Object: <User: 0xe07b260> (entity: User; id: 0xa65ab70 <x-coredata://392983AD-D649-4D68-A93F-D86109BC009C-995-000004B584F1BB06/User/piphone5> ; data: <fault>)
2013-08-18 11:07:13.313 Time[1177:c07] Number of Objects Returned 1
2013-08-18 11:07:13.314 Time[1177:c07] fetchObject Object <User: 0xa532cc0> (entity: User; id: 0xb426de0 <x-coredata://3336122B-7117-4D92-B0A1-DDBAF80DDBF7-1177-000006EEE046E326/User/piphone5> ; data: <fault>)
2013-08-18 11:07:13.314 Time[1177:c07] User <User: 0xa532cc0> (entity: User; id: 0xb426de0 <x-coredata://3336122B-7117-4D92-B0A1-DDBAF80DDBF7-1177-000006EEE046E326/User/piphone5> ; data: <fault>)
这就是我在复习中要做的。m:

@interface Review()
@property (strong, nonatomic) User *user;
@end
@sythesize = user;
....
if (fetchedObjects.count>=1)
{
    NSLog(@"Number of Objects Returned %i", fetchedObjects.count);
    NSManagedObject *fetchedObject = [fetchedObjects objectAtIndex:0];
    NSLog(@"fetchObject Object %@", fetchedObject);

    //Addition
    user = (User*)(fetchedObject);
    NSLog(@"User %@", user);
}
以下是日志:

2013-08-18 10:26:25.082 Time[995:c07] Number of Objects Returned 1
2013-08-18 10:26:25.082 Time[995:c07] User Object: <User: 0xe07b260> (entity: User; id: 0xa65ab70 <x-coredata://392983AD-D649-4D68-A93F-D86109BC009C-995-000004B584F1BB06/User/piphone5> ; data: <fault>)
2013-08-18 11:07:13.313 Time[1177:c07] Number of Objects Returned 1
2013-08-18 11:07:13.314 Time[1177:c07] fetchObject Object <User: 0xa532cc0> (entity: User; id: 0xb426de0 <x-coredata://3336122B-7117-4D92-B0A1-DDBAF80DDBF7-1177-000006EEE046E326/User/piphone5> ; data: <fault>)
2013-08-18 11:07:13.314 Time[1177:c07] User <User: 0xa532cc0> (entity: User; id: 0xb426de0 <x-coredata://3336122B-7117-4D92-B0A1-DDBAF80DDBF7-1177-000006EEE046E326/User/piphone5> ; data: <fault>)
以下是我的CoreData设置:


为什么这不起作用?用户仍然显示为故障?我在fetchRequest中有以下行:
[fetchRequest setReturnsObjectsAsFaults:NO]

日志中显示为故障的托管对象没有问题。使用它或访问它的属性,核心数据将以最有效的方式以最小的资源压力填补故障

最后一部分很重要,因为这是您不想更改核心数据的错误行为的原因。发送通知的必要性并不会改变这一点

此外,请参考以下章节中的断层部分:

批量断层作用

您可以通过使用带IN运算符的谓词执行fetch请求来批处理对象集合的故障,如下例所示。[……]

在OS X v10.5及更高版本中创建提取请求时,可以使用NSFetchRequest方法setReturnsObjectsAsFaults:确保托管对象不会作为故障返回


因此,您可以看到,特殊的获取请求快捷方式仅对OS X可用。请继续阅读上面的源代码,查看替代的预获取。

这是一个StackMob限制。在里面 明确说明
returnObjectsAsFaults
/
setReturnObjectsAsFaults:

不受支持。

核心数据“故障”是一个“占位符对象”,完全没有错误。如有必要,将从数据库中提取数据。尝试登录,例如
user.email
,它应该可以工作。是的,这是我通过访问其属性之一来触发故障的唯一方法。我希望[FetchRequestSetReturnsObjectsAsFaults:否];哦,对不起,我忽略了你问题中的那一部分。但是我用
[fetchRequest setReturnsObjectsAsFaults:NO]
做了一个小测试,它按预期工作要将用户对象作为相关对象添加到通知对象,添加的对象是否为错误也应该没有区别。但问题仍然是,即使显式设置了
[fetchRequest setReturnsObjectsAsFaults:no]
,为什么对象仍作为错误返回。至少这是OP声称的。
setReturnsObjectsAsFaults:
在iOS 3.0或更高版本上也可用。不是根据上述来源。我已经用iOS模拟器对其进行了测试,
[fetchRequest setReturnsObjectsAsFaults:NO]
有效。不幸的是,《核心数据编程指南》不是最新的。很好!我不知道这一点。