Tag: 数据存储

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

核心数据,NSKeyedArchiver和UserDefaults是程序员在应用程序启动之间可以持久保存数据的三种方式。 尽管核心数据稍微复杂一些,但是当存储的信息需要结构时,它很有用。 与核心数据相比,NSKeyedArchiver不太复杂且运行速度较慢,但​​使用起来却简单得多。 UserDefaults是保存数据的最简单方法。 核心数据 核心数据的主要好处包括: 有效查询的能力 数据的结构使得每个实体都具有某些属性(考虑具有特定类型的属性),并且可能通过关系也可能不与其他实体相关 自动迁移-基本上,这仅意味着当您创建核心数据模型时,即会创建一个SQLite数据库。 如果随后更改数据模型(例如,向数据模型添加更多属性),则新数据模型与原始持久性存储不兼容。 Apple为我们处理了从一种数据模型版本到另一种数据模型版本的“迁移”-感谢Apple! 在深入研究代码之前,首先让我们看一下一些定义: NSPersistentContainer负责读取/写入核心数据。 类型为NSManagedObjectContext的viewContext。 您可以通过NSManagedObjectContext创建核心数据对象的实例。 为了将核心数据集成到您的项目中,您必须首先创建一个核心数据.xcdatamodel文件。 在此文件中,您将定义要保留的实体,包括每个实体的属性。 创建.xcdatamodel文件后,然后将一个新的.swift文件添加到项目中,该文件将包含代码数据的所有样板代码。 以下代码中需要注意的三件事- NSPeristentContainer名称必须与.xcdatamodel文件相同。 我创建了一个单例,以便在应用程序的整个过程中只有一次通过核心数据保存的信息实例。 如果您总体上对单例/设计模式感到好奇,请查看此博客。 不要忘记将CoreData导入.swift文件! *如果创建一个新项目并选择向该项目添加核心数据,则上面的样板代码将显示在App Delegate中。 除了保存数据之外,您还可能希望获取该数据以在应用程序下次启动时填充您的应用程序。 假设您在.xcdatamodel文件中创建了一个名为“ Book”的实体。如下面的代码所示,您可以使用NSFetchRequest来获取数据。 我创建了一个名为“ Books”的数组,该数组等于[Book](),表示Book实体的数组。 每当我想用此保存的数据填充我的应用程序时,我都会调用此CoreDataModel.sharedInstance.fetchWorkoutData()函数,并将要使用的数据设置为等于CoreDataModel.sharedInstance.books。 从核心数据中删除信息也非常简单-您所需要做的就是获取存储的信息并遍历数组,并从持久性容器中删除每个对象。 瞧! 我没有在这篇文章中深入研究关系,但是下面的博客将深入研究核心数据中关系的代码。 NSKeyedArchiver NSKeyedArchiver提供了直接与磁盘交互的功能。 具体来说,它将序列化NSCoding,这是一种具有两种方法的协议: 编码(使用aCoder:NSCoder) 初始化?(编码器aDecoder:NSCoder) 在下面的示例中,我的目标是保留[Person]数组。 类Person具有两个属性:firstName(字符串类型)和lastName(字符串类型)。 从下面的代码中可以看到,Person类采用并符合NSCoding协议。 通过NSKeyedArchiver存储和检索数据非常简单。 当您想存储信息时,可以仅调用NSKeyedArchiver.archiveRootObject -这是一个内置方法。 同样,当您要检索持久数据时,可以调用另一个内置函数NSKeyedUnarchiver.unarchiveObject。 如您所见,NSKeyedArchiver比Core Data实施起来简单得多,并且是持久保存数据的诱人选择。 用户默认值 UserDefaults是一个类,允许简单存储不同的数据类型。 它主要用于存储少量数据,以在应用程序启动或设备重新启动之间持续存在。 UserDefaults可以存储基本类型(bool,float,double,int等)和更复杂的类型(数组,字典)。 尽管UserDefaults没有结构,但据说它比核心数据要快,因为它只是键值对。 由于它没有结构,因此存储不需要结构的数据很有用,因此不需要用户偏好。 需要注意的一件事是,如果您重置一个键,那么无论两个键是否都必须相同,如果一个键具有所有小写字母,而第二个键具有一个大写字母,则现有数据将不会被替换。

持久数据(Swift 4.1)

Apple提供了两种在应用程序启动之间保留数据的方法:Core Data和NSKeyedArchiver。 NSKeyedArchiver编码(保存)和解码(检索)您要持久保存的所有与NSCoding兼容的类。 尽管NSKeyedArchiver不如Core Data健壮(它速度较慢且手动),但它可以完成所需的持久化数据工作,并且不如Core Data复杂。 在Swift 4.1版本中, Apple通过遵循我们的自定义类型展示了一种最简单的数据编码和解码方式。 可编码-用于编码 可解码-用于解码 可编码-编码和解码 它也提供对class,struct和enum的支持。我发现Codable有两个很棒的Codable 。 制图 存档和取消存档 制图 假设您以JSON字符串的形式接收到响应(如果它是编码数据,则更好)。 使用该JSON字符串初始化我们的类型会很好,对吗? 让我们写下来: Swift 4.1在keyDecodingStrategy上具有一个新的keyDecodingStrategy属性,可以根据需要在snake_case和camelCase之间自动转换。 相反的属性keyEncodingStrategy ,也存在于JSONEncoder因此您可以将您的Swift camelCase名称转换回snake_case。 Swift 4.1通过keyDecodingStrategy改进了Codable Swift 4.0带来了许多很棒的新功能,包括多行字符串,更好的键路径以及许多改进的功能…… www.hackingwithswift.com 考虑我们的模型是否符合Codable ,如下所示: 快乐编码!