CoreData (MagicalRecord) 返回错误的值

Posted

技术标签:

【中文标题】CoreData (MagicalRecord) 返回错误的值【英文标题】:CoreData (MagicalRecord) returning the wrong values 【发布时间】:2013-06-24 19:32:42 【问题描述】:

为了拯救动物园里的主要动物,我这样做:

-(void)makePrimary:(Animal*)animal

Zoo *currentZoo = [Zoo findFirstByAttribute:@"zooId" withValue:self.currentZooId];
currentZoo.primaryAnimalId = animal.animalId;

[[NSManagedObjectContext defaultContext] saveToPersistentStoreAndWait];
DLog(@"primaryAnimalId: %d", currentZoo.primaryAnimalId.intValue); //logs "3"


执行此操作后,currentZoo 的 primaryAnimalId 记录为 3。我正在使用 Firefox SQLite Manager 来验证这一点。 ZPRIMARYANIMALID 也是 3。

现在,我导航到应用程序的另一个部分,我需要在其中显示主要动物。所以我这样做:

-(Animal*)getPrimaryAnimalForCurrentZoo


    Zoo *currentZoo = [Zoo findFirstByAttribute:@"zooId" withValue:self.currentZooId];
    DLog(@"primaryAnimalId: %d", currentZoo.primaryAnimalId.intValue); //logs 2
    Animal *primaryAnimal = [Animal MR_findFirstByAttribute:@"animalId" withValue:currentZoo.primaryAnimalId];

    return primaryAnimal;


让我非常懊恼的是,我的 primaryAnimalId 得到了“2”,因此返回了错误的动物。 “2”是动物在我通过makePrimary: 更改之前的值。 currentZooId 在这两种方法中都是 0。

我不明白的是,当我可以清楚地看到数据库中当前的正确值(在 SQLite 管理器中)时,如何从 Core Data 中获取错误的值。这怎么可能?我该如何解决?

【问题讨论】:

【参考方案1】:

您是否更新了 self.currentZooId 以反映您的更改?


更新: 因此,您在此处要求数据集中的第一条记录。问题是,您没有指定订单。也就是说,findFirst 只是询问所有数据存储,然后只返回列表中的第一个(查看代码了解更多细节)。由于该列表可以按任何顺序排列,因此您将获得数据存储在特定实例中为您提供的任何内容。您要做的是向 findFirst 添加一个排序参数,以确保您始终获得您期望的项目。查看标题以找到带有排序参数的正确 firstFirst 方法。

【讨论】:

是的,这两种方法的值都是0。

以上是关于CoreData (MagicalRecord) 返回错误的值的主要内容,如果未能解决你的问题,请参考以下文章

(CoreData) MagicalRecord 突然停止持久保存

在 TodayExtension 中使用 MagicalRecord (CoreData)

CoreData(MagicalRecord) 获取保存的对象

MagicalRecord (CoreData) + Today Extension (iOS8)... 他们会玩吗?

使用 MagicalRecord 3 的 CoreData 内存设置

使用 MagicalRecord 插入后 CoreData 关系未更新