原文链接:点击查看
第一篇译文,如果不好就见谅。谢谢。
他们是程序员在处理App启动时数据可以持续存在的三种方法。尽管core data稍微有点复杂,但是当存储必要的结构信息是是非常有帮助的。NSKeyedArchiver相对于core data来说是相对简单和相对较慢。UserDefaults是持久化数据最简单的方法。
Core Data:它主要的优势如下:
1:有效快速的查询能力
2:数据之间相关联,比如每一个实体拥有确定的属性(..特性和明确类型),通过关联关系,有或者没有关联到其他实体。
3:自动转移,基本的意思就是说,当你创建一个core data模型的时候,一个SQLite数据库也被创建了。如果紧接着你修改这个数据模型,比如说增加了更多的属性,造成与原来本地存储的数据的不同。苹果会处理这不同版本的数据,感谢苹果。
在我们开始code之前,先让我们做如下描述定义:
1:NSPersistentContainer负责向core data中读写数据
2:可以通过NSManagedObjectContext创建一个core data的实例对象。
在你的项目里使用core data,你首先必须先创建一个core data .xcdatamodel文件,在这个文件里定义了实体,包括每一个实体的属性,从而实现数据的存储。在创建了 .xcdatamodel文件之后,然后在工程内创建一个新的swift文件,它将会承载实现core data 所有的相关代码。在下面的代码中需要注意三件事:
1:NSPeristentContainer的名字一定要和 .xcdatamodel文件的相同。
2:为了在整个程序运行期间始终只有一个core data数据实例对象,因为我创建了单例。如果你还不知道单例或者常用的设计模式,可以浏览这篇文章。
3:你要忘记导入CoreData库到的 .swift文件。
*如果建了一个新的工程,并且选中了使用coredata,在AppDelegate文件里会自动生成相关的代码。
除了保存数据之外,还希望在在App再次启动的时候,可以获取相应的数据来填充内容。让我们在.xcdatamodel文件中创建一个叫Book的实例。正如你下面看到的代码,使用用NSFetchRequest获取数据。我创建了一个数组Books,它是指一个Book的实体数组,等同于 [Book](),无论何时同步保存的数据,我使用CoreDataModel.sharedInstance.fetchWorkoutData()方法 和我使用CoreDataModel.sharedInstance.books设置的数据是等同的。
相比添加数据来说,从core data中移除数据是很简单的,你要做的就是获取存储的数据,遍历数据,从中持续存在的容器中删除每一个要删除的对象。你看!
在本篇文章中,我没有详细深入介绍关联关系,但是在这篇文章深入代码层面介绍了core data的关联关系。
NSKeyedArchiver:它提供和磁盘直接交互的能力。特别的是,它实现了NSCoding协议,包含两个方法:
1.encode(with aCoder: NSCoder)
2.init?(coder aDecoder: NSCoder)
在下面的例子中,我将一个[Person]数组持久化存储为目标。Person类有两个属性,字符串类型:firstName 和 lastName。正如如下代码所看到,Person类实现了NSCoding协议的两个方法。
通过NSKeyedArchiver存储和检索数据是非常直接的,当你要存储信息的时候,你只需要使用NSKeyedArchiver.archiveRootObject,它是一个内置的方法。
同样,当你要检索持久化的数据时,可以使用另一个内置方法:NSKeyedUnarchiver.unarchiveObject。
正如你看到的,NSKeyedArchiver是一个相对Core Data来说更加简单和吸引人的持久化方案。
User Defaults
User Defaults是一个可以存储不同的数据类型的的存储类。它的持久化存储数据主要存储少量的账户信息,用于App启动或者重启时。User Defaults存储包括的基本类型:bool, float, double, int, etc 和复杂一点的类型:array, dictionary。尽管它没有结构,据说相比core data更快,因为它是键值对。因为没有结构,对存储数据是不要结构是很有帮助的,因此,开发者更加偏向使用它。
需要注意的是:当你重置一个key的时候,保存数据将会被替换,前提时key必须时一模一样。如果一个key含有小写字母,一个含有大写字母,存储的数据将不会被替换。
谢谢阅读,开心coding。