iOS Core Data вставка / извлечение взаимосвязи "многие-многие"
В моем приложении у меня есть поездка, которая имеет много остановок. Это было указано в файле.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 ответа
Вы не сохраняете свой контекст после применения изменений (новый StopOff
объекты).
После добавления StopOff
, вызов [managedObjectContext save:&error]
и вы сохраните свой новый объект в магазине.
CoreData не сохраняется автоматически и без save:
будучи вызванным, вы потеряете все временные изменения, внесенные в контекст.
Кроме того, нет необходимости [trip addStopObject:newStop];
как CoreData заботится об этом как часть обратных отношений.
У вас есть настройка отношения ко многим: вам не нужны оба newStop.trip = trip
а также [trip addStopObject:newStop]
, Я думаю, именно поэтому вы получаете свое предупреждение.
В какой-то момент вам захочется позвонить:
NSError *error = nil;
[managedObjectContext save:&error];