iOS Core Data to-many关系插入/获取

时间:2013-11-25 03:29:01

标签: ios core-data nsfetchedresultscontroller iphonecoredatarecipes datapersistance

在我的申请表中,我有旅行,有很多站点。这已在.xcdatamodeld文件中指定。我可以以任何我想要的方式操纵旅行,他们都可以正常工作。但是,我遇到了为每次旅行添加许多停靠点的问题。它似乎没有持续下去。以下是代码。此代码位于旅行的detailViewController内,因此已经点击了特定的旅程。

Trip * trip = [self retrieveObjectWithID:_passedObjectId];


    StopOff *newStop = [NSEntityDescription insertNewObjectForEntityForName:@"StopOff" inManagedObjectContext:managedObjectContext];

    [newStop setValue:stopName forKey:@"stopName"];
    [newStop setValue:stopCity forKey:@"stopCity"];
    [newStop setValue:stopDate forKey:@"stopDate"];
    [newStop setValue:stopAddress forKey:@"stopAddress"];
    [newStop setValue:stopState forKey:@"stopState"];
    [newStop setValue:stopTime forKey:@"stopTime"];

    newStop.trip = trip;
    [trip addStopObject:newStop];

    NSLog(@" stop count %i", [trip.stop count]);

以下是我第一次按下按钮运行时我的控制台吐出的内容:CoreData: annotation: to-many relationship fault "stop" for objectID 0x8bb2810 <x-coredata://4CE70783-4729-46E0-B18B-8E325D1020CC/Trip/p20> fulfilled from database. Got 0 rows 2013-11-24 21:19:43.417 Tracker[30633:70b] stop count 1

如果我一直按下按钮,停止计数会增加。如果我重新启动应用程序,停止计数会重新开始并重新开始,所以它似乎不会持续存在。

我的问题是,我究竟如何插入许多与旅程相对应的停靠点,一旦插入并持续存在,我该如何继续前进并获得相应的停靠点。

以下是检索每次旅行的代码。并使用managedObjectContext在父视图控制器中处理NSFetchedResultsController。如果您需要更多信息,请告诉我

- (Trip*)retrieveObjectWithID:(NSManagedObjectID*)theID
{
    NSError *error = nil;
    Trip *theObject = (Trip*)[self.managedObjectContext existingObjectWithID:theID error:&error];
    if (error)
        NSLog (@"Error retrieving object with ID %@: %@", theID, error);
    return theObject;
}

2 个答案:

答案 0 :(得分:3)

应用更改后,您不会保存上下文(新StopOff个对象)。

添加StopOff后,请致电[managedObjectContext save:&error],然后您将新对象保留到商店。

CoreData不会自动保存,如果没有调用save:,您将丢失对上下文所做的任何时间更改。

此外,不需要[trip addStopObject:newStop];,因为CoreData会将其作为反向关系的一部分来处理。

答案 1 :(得分:1)

您设置了多对多关系:您不需要newStop.trip = trip[trip addStopObject:newStop]。我想这就是你收到警告的原因。

在某些时候,您需要致电:

NSError *error = nil;
[managedObjectContext save:&error];