如何在 Core Data 中保存用户偏好?

Posted

技术标签:

【中文标题】如何在 Core Data 中保存用户偏好?【英文标题】:How to save user preferences in Core Data? 【发布时间】:2015-08-31 20:26:31 【问题描述】:

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

我面临的问题是,当isFavorite 的值在单击按钮时从 false 更改为 true 并且用户关闭应用程序时。重新启动后,isFavorite 值将更改回保存在 .csv 文件中的值。 如何保存用户更改?这样最喜欢的地方就留在收藏列表中。

我阅读了几篇关于NSUserDefaults 的文章,但无法正确理解。如果有人可以帮助我考虑我的应用场景,将不胜感激。

【问题讨论】:

NSUserDefaults 与 Core Data 无关——它更像是一个被写入文件的字典。 【参考方案1】:

CoreData 具有持久性,可在应用启动期间保存数据。如果您每次应用程序启动时都使用 csv 文件预加载 CoreData 模型,那么它当然不会被持久化,因为您只从 csv 文件加载数据而没有将其保存回来。你要么必须

每次之后将数据保存回 csv 文件(硬) 将所有数据保存在 CoreData 中(更简单) 将两者结合起来(最难)

【讨论】:

如何在不解析 csv 文件的情况下将数据预加载到 coredata 中? @sunnyk 您必须解析 csv 才能从中获取数据,这就是它的工作原理。不过你不需要手动做,我相信你可以在网上找到解析器 解析器不会做我手动做的同样的工作。有什么不同 ?我真的很困惑 你在手动做什么?我认为您没有手动解析 csv。 我正在使用这个链接来解析csv文件appcoda.com/core-data-preload-sqlite-database【参考方案2】:

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

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

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

【讨论】:

这是我现在面临的问题link【参考方案3】:

您必须将更改保存在 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 类,地点: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 文件来加载数据。

【讨论】:

“将 csv 文件放入 coreData”是什么意思?我该怎么做? CSV 文件或其他类型的文件与您以前的数据,如果您使用 CoreData 它没有意义......所以您必须从 .csv 读取所有数据(仅第一次)并将其放入核心数据模型的对象并保存。您必须保留从 .csv 读取的数据并创建核心数据对象并保存您的上下文。在您可以删除 .csv 文件并继续仅使用您的核心数据模型之后。 只有在未预加载数据时才调用我的 preLoad 函数。每次应用启动时我都不会调用该函数。 好的!但是您必须保存当前模型的上下文。否则,核心数据将继续为空。 对不起,我是 swift 新手。如何保存上下文?

以上是关于如何在 Core Data 中保存用户偏好?的主要内容,如果未能解决你的问题,请参考以下文章

如何将用户登录的 JSON 响应保存到 Core Data 中以跟踪 Swift 中的用户状态?

如何将日期类型保存到 Swift Core Data 中实体的属性?

如何在 Documents 文件夹中保存 UIImagePicker 中的 UIImage 并获取路径字符串以保存在 Swift 中的 Core Data 中

iPhone 上是不是存在 Core Data?或者您将如何在 iPhone 上保存数据?

如何在 Swift 中将可转换属性保存到 Core Data

如何使用 Core Data 有效地保存 UI/主线程中所做的更改?