问题描述
|
我现在正在努力解决与CoreData相关的问题:
我有一个带有标签栏的基于视图的应用程序。
前两个选项卡是显示我的CoreData中内容的视图控制器,第三个选项卡具有UIPickerView,可以在其中选择数据。
然后,第三和第二视图控制器应基于UIPickerView选择来选择正确的实体。
为了进一步说明这一点:在我的managedobjectcontext中,我有16个实体。基于ThirdViewController中的UIPickerView选择,我想使用相应的实体并更新FirstViewController和SecondViewController。
这也应该是一个持久的解决方案,以便用户可以退出应用程序,但是应该存储来自UIPickerView的选择。也许这是NSUserDefaults的东西吗?
任何帮助将不胜感激!
解决方法
对于需要保存实体名称还是特定的托管对象,我不确定,但是在两种情况下,解决方案都是相同的:您需要在NSUserDefaults中存储引用。
要将实体存储在用户默认设置中,您只需将实体名称另存为字符串即可。所以像:
[[NSUserDefaults standardUserDefaults] setValue:entityNameString forKey:@\"currentlySelectedEntity\"];
...并检索它:
NSString *currentEntity=[[[NSUserDefaults standardUserDefaults] valueForKey:@\"currentlySelectedEntity\"];
如果需要保存对特定托管对象的引用,则需要保存已保存对象的托管对象ID。储蓄非常重要。在保存创建对象的上下文之前,对象ID仅具有一个临时值,该临时值将在保存时更改。如果使用临时值,则对对象的任何引用都将丢失。
保存对象ID:
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];
(以上代码未编译,可能包含输入错误,因此请勿仅复制并粘贴。)