CoreData(MagicalRecord)返回错误的值

时间:2013-06-24 19:32:43

标签: ios core-data nsfetchrequest magicalrecord

为了将动物保存在动物园中,我这样做:

-(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也在那里。

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

-(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”,因此返回了错误的动物。在通过makePrimary:更改之前,“2”是动物的先前值。两种方法中currentZooId为0。

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

1 个答案:

答案 0 :(得分:0)

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


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