我正在努力解决与CoreData相关的问题一段时间了:
我有一个基于视图的应用程序,其中包含一个tabbar。 前两个选项卡是显示来自我的CoreData的内容的视图控制器,第三个选项卡有一个UIPickerView,我可以在其中选择数据。 然后,第三个和第二个视图控制器应根据UIPickerView选择选择正确的实体。
为了澄清这一点:在我的managedobjectcontext中,我有16个实体。根据ThirdViewController中的UIPickerView选择,我想使用相应的实体并更新FirstViewController和SecondViewController。
这也应该是一个持久的解决方案,以便用户可以退出应用程序,但应该存储UIPickerView中的选择。也许这适用于NSUserDefaults?
非常感谢任何帮助!
答案 0 :(得分:0)
我不清楚您是否需要保存实体名称或特定托管对象,但在两种情况下解决方案都是相同的:您需要在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];
(以上代码未经编译,可能包含拼写错误,因此请勿复制并粘贴。)