核心数据与NSKeyedArchiver与用户默认值

核心数据,NSKeyedArchiver和UserDefaults是程序员在应用程序启动之间可以持久保存数据的三种方式。 尽管核心数据稍微复杂一些,但是当存储的信息需要结构时,它很有用。 与核心数据相比,NSKeyedArchiver不太复杂且运行速度较慢,但​​使用起来却简单得多。 UserDefaults是保存数据的最简单方法。

核心数据

核心数据的主要好处包括:

  1. 有效查询的能力
  2. 数据的结构使得每个实体都具有某些属性(考虑具有特定类型的属性),并且可能通过关系也可能不与其他实体相关
  3. 自动迁移-基本上,这仅意味着当您创建核心数据模型时,即会创建一个SQLite数据库。 如果随后更改数据模型(例如,向数据模型添加更多属性),则新数据模型与原始持久性存储不兼容。 Apple为我们处理了从一种数据模型版本到另一种数据模型版本的“迁移”-感谢Apple!

在深入研究代码之前,首先让我们看一下一些定义:

  1. NSPersistentContainer负责读取/写入核心数据。
  2. 类型为NSManagedObjectContext的viewContext。 您可以通过NSManagedObjectContext创建核心数据对象的实例。

为了将核心数据集成到您的项目中,您必须首先创建一个核心数据.xcdatamodel文件。 在此文件中,您将定义要保留的实体,包括每个实体的属性。 创建.xcdatamodel文件后,然后将一个新的.swift文件添加到项目中,该文件将包含代码数据的所有样板代码。 以下代码中需要注意的三件事-

  1. NSPeristentContainer名称必须与.xcdatamodel文件相同。
  2. 我创建了一个单例,以便在应用程序的整个过程中只有一次通过核心数据保存的信息实例。 如果您总体上对单例/设计模式感到好奇,请查看此博客。
  3. 不要忘记将CoreData导入.swift文件!

*如果创建一个新项目并选择向该项目添加核心数据,则上面的样板代码将显示在App Delegate中。

除了保存数据之外,您还可能希望获取该数据以在应用程序下次启动时填充您的应用程序。 假设您在.xcdatamodel文件中创建了一个名为“ Book”的实体。如下面的代码所示,您可以使用NSFetchRequest来获取数据。 我创建了一个名为“ Books”的数组,该数组等于[Book](),表示Book实体的数组。 每当我想用此保存的数据填充我的应用程序时,我都会调用此CoreDataModel.sharedInstance.fetchWorkoutData()函数,并将要使用的数据设置为等于CoreDataModel.sharedInstance.books。

从核心数据中删除信息也非常简单-您所需要做的就是获取存储的信息并遍历数组,并从持久性容器中删除每个对象。 瞧!

我没有在这篇文章中深入研究关系,但是下面的博客将深入研究核心数据中关系的代码。

NSKeyedArchiver

NSKeyedArchiver提供了直接与磁盘交互的功能。 具体来说,它将序列化NSCoding,这是一种具有两种方法的协议:

  1. 编码(使用aCoder:NSCoder)
  2. 初始化?(编码器aDecoder:NSCoder)

在下面的示例中,我的目标是保留[Person]数组。 类Person具有两个属性:firstName(字符串类型)和lastName(字符串类型)。 从下面的代码中可以看到,Person类采用并符合NSCoding协议。

通过NSKeyedArchiver存储和检索数据非常简单。 当您想存储信息时,可以仅调用NSKeyedArchiver.archiveRootObject -这是一个内置方法。

同样,当您要检索持久数据时,可以调用另一个内置函数NSKeyedUnarchiver.unarchiveObject。

如您所见,NSKeyedArchiver比Core Data实施起来简单得多,并且是持久保存数据的诱人选择。

用户默认值

UserDefaults是一个类,允许简单存储不同的数据类型。 它主要用于存储少量数据,以在应用程序启动或设备重新启动之间持续存在。 UserDefaults可以存储基本类型(bool,float,double,int等)和更复杂的类型(数组,字典)。 尽管UserDefaults没有结构,但据说它比核心数据要快,因为它只是键值对。 由于它没有结构,因此存储不需要结构的数据很有用,因此不需要用户偏好。

需要注意的一件事是,如果您重置一个键,那么无论两个键是否都必须相同,如果一个键具有所有小写字母,而第二个键具有一个大写字母,则现有数据将不会被替换。