#objective-c #core-data
#objective-c #core-данные
Вопрос:
Я уже некоторое время борюсь с проблемой, связанной с CoreData:
У меня есть приложение на основе представления с панелью вкладок в нем. Первые две вкладки — это контроллеры просмотра, которые отображают содержимое из моих CoreData, на третьей вкладке есть UIPickerView, где я могу выбирать данные. Затем третий и второй контроллеры просмотра должны выбрать правильный объект на основе выбора UIPickerView.
Чтобы прояснить это немного больше: в моем managedobjectcontext у меня есть 16 объектов. На основе выбора UIPickerView в ThirdViewController я хочу использовать соответствующий объект и обновить FirstViewController и SecondViewController.
Это также должно быть постоянным решением, чтобы пользователь мог выйти из приложения, но выбор из UIPickerView должен быть сохранен. Может быть, это что-то для NSUserDefaults?
Любая помощь была бы высоко оценена!
Комментарии:
1. Я не совсем понимаю, о чем вы спрашиваете. Вы спрашиваете, как сохранить что-либо в Core Data в целом? Вы спрашиваете, следует ли вам использовать Core Data в отличие от пользовательских настроек по умолчанию? Вы спрашиваете, как передать конкретный управляемый объект другому контроллеру представления?
2. О, прошу прощения за то, что вызвал небольшую путаницу. Я не хочу сохранять что-либо в Core Data. Чтобы прояснить это еще раз: у меня есть 3 ViewControllers: ViewController # 1: показывает данные из Core Data ViewController # 2: показывает данные из Core Data ViewController # 3: имеет UIPickerView, который позволяет пользователю выбрать один объект с его атрибутами из Core Data.
3. Чего я хочу, так это следующего: когда пользователь выбирает объект из ViewController # 3, эта информация должна постоянно храниться, чтобы ViewController # 1 и # 2 всегда знали (даже когда пользователь выходит из приложения — без фона!), из какого объекта они должны получать данные. Я ясно выразился?
4. Вы говорите «объект», но я думаю, вы имеете в виду конкретный управляемый объект. Объекты относятся к управляемым объектам так, как классы относятся к экземплярам. Например. У вас может быть
Person
объект в вашей модели данных для описания человека, т. е. Имя, фамилия, но конкретный человек, скажем «Боб Смит», будет описываться конкретным управляемым объектом, инициализированным дляPerson
объекта. Который вам нужно сохранить из ViewController # 3.
Ответ №1:
Я не совсем понимаю, нужно ли вам сохранять имя объекта или конкретный управляемый объект, но в обоих случаях решение одно и то же: вам нужно сохранить ссылку в NSUserDefaults.
Чтобы сохранить объект в пользовательских настройках по умолчанию, вам нужно просто сохранить имя объекта в виде строки. Итак, что-то вроде:
[[NSUserDefaults standardUserDefaults] setValue:entityNameString forKey:@"currentlySelectedEntity"];
… и для его извлечения:
NSString *currentEntity=[[[NSUserDefaults standardUserDefaults] valueForKey:@"currentlySelectedEntity"];
Если вам нужно сохранить ссылку на конкретный управляемый объект, вам необходимо сохранить идентификатор управляемого объекта для сохраненного объекта. Сохранение очень важно. До сохранения контекста, в котором был создан объект, идентификатор объекта имеет только временное значение, которое изменится при сохранении. Любая ссылка на объект будет потеряна, если вы используете временное значение.
Чтобы сохранить идентификатор объекта:
NSManagedObject *mo=[NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext];
//... save the context
NSManagedObjectID *moID=[mo objectID];
NSURL *moIDURI=[moID URIRepresentation];
[[NSUserDefaults standardUserDefaults] setValue:moIDURI forKey:@"currentlySelectedTestObject"];
… чтобы повторно получить его:
NSURL *uri=[[NSUserDefaults standardUserDefaults] valueForKey:@"currentlySelectedTestObject"];
NSManagedObjectID *moID=[self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];
NSManagedObject *mo=[self.managedObjectContext objectRegisteredForID:moID];
(Приведенный выше код не скомпилирован и может содержать опечатки, поэтому не просто копируйте и вставляйте его.)