如何在Core Data中保存用户首选项?

时间:2015-08-31 20:26:31

标签: ios iphone swift core-data nsuserdefaults

我正在使用Core Data来保存我的数据。我从.csv文件预加载数据。我有一个名为places的实体,其属性为isFavorite。我正在填充UITableViewController中的数据。 TableViewCell由一些标签和一个按钮组成。当用户点击button isFavorite的值从false变为true时,反之亦然。我想在单独的tableView中显示用户最喜欢的地方列表。只有那些地方会显示在isFavorite值为真的收藏夹标签中。

我面临的问题是,当点击按钮时isFavorite的值发生变化时,从false变为true并且用户关闭应用程序。重新启动后,isFavorite值将更改回.csv文件中保存的值。 如何保存用户更改?所以最喜欢的地方仍然在最喜欢的名单中。

我阅读了一些关于NSUserDefaults的文章,但无法理解。如果有人可以帮助我考虑我的应用程序的情况,将不胜感激。

3 个答案:

答案 0 :(得分:0)

CoreData具有持久性,可以在整个应用程序启动过程中保存数据。如果您每次应用程序启动时都使用csv文件预加载CoreData模型,当然它不会被保留,因为您只是从csv文件加载数据而不保存它。你要么

  • 每次(硬)
  • 后将数据保存回csv文件
  • 将所有数据保存在CoreData中(更简单)
  • 在两者之间进行组合(最难)

答案 1 :(得分:0)

您只是忘了保存。每次用户更改对象时:

// Swift 2.0
do { try context.save() } catch {}

随意构建catch块以进行正确的错误处理。

答案 2 :(得分:-1)

您必须在coreData中保存更改...它不仅具有数据预加载...您可以保留数据。

问题......怎么样?

我认为你的AppDelegate标题中有这个属性:

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

在你的AppDelegate .m之类的东西,其中包括:

- (NSManagedObjectModel *)managedObjectModel { .... }

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { .... }

- (NSManagedObjectContext *)managedObjectContext { .... }

- (void)saveContext {
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        NSError *error = nil;
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}
  

CoreData类,Places:MTManagedObject

所以在你的tableViewController中,当它在isFavourite ON和isFavourite OFF之间切换时获取按钮的动作你必须这样做:

AppDelegate *appdelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = appdelegate.managedObjectContext;

Places *currentPlace = .... get 'place' object to modified from coredata using context object ....
currentPlace.isFavourite = @(isPlaceFavourite); // state get from button

[appdelegate saveContext];
  

注意将.csv数据文件放入coreData并使用coreData而非.csv文件加载数据。