[翻译] NSManagedObjectModel
原创作者:Apple
原文链接: NSManagedObjectModel
翻译:Zack
一个编程的方式呈现 .xcdatamodeld 文件来描述你的对象。
声明
class NSManagedObjectModel : NSObject
预览
模型包含一个或多个 NSEntityDescription 对象(呈现在架构中的实体)。每个 NSEntityDescription 对象有属性描述对象NSPropertyDescription 子类的实例 )-- 呈现在架构中实体的属性(或字段)。 Core Data 框架在以下几种方式中使用描述。
- 在 Interface Builder 中给 UI 的创建添加约束
- 在运行时验证属性以及关系值
- 在你的被管理对象和数据库或基于文件的对象持久化架构建立映射
被管理的对象维护 在每个实体对象和相应的被管理对象类(使用持久化存储机制在Core Data 框架中)的映射。你可以确定特殊的被管理对象的实体通过实体方法。
你通常创建被管理对象的模型通过使用在 Xcode 中的数据模型工具,但也是有可能如果有需要通过编程的方式构建一个模型。
加载模型文件
被管理对象的模型通常存储在一个 project 或者 framework 中。 为了加载一个模型,你需要给构造器提供一个 URL。 注意加载模型不会对加载所有的实体有影响。
存储拉去请求
通常,你需要分享共同特征的集合对象。有时你需要预先定义这些特征(属性值);有时候你需要在运行时提供值。例如你想要拉去所有皮克斯公司拥有的电影,或者运行时拉取所有超过用户指定数量的电影。
拉去请求经常在被管理对象模型中作为模版预定义。它允许在模型中预定义被命名的查询以及参数。通常包含在运行时需要被替换的变量。 NSManagedObjectModel 提供一个 API去通过名字去索引一个被存储的请求,并且执行变量替换--查看fetchRequestTemplate(forName:)
和 fetchRequestFromTemplate(withName:substitutionVariables:)
.
你通常定义拉去请求模版使用 Xcode 的 Data Model 编辑器。你可以通过程序创建拉去请求模版,并且去关联它们和模型通过使用 setFetchRequestTemplate(_:forName:)
方法。
同一模型中对的多种配置
对于同一个模型,你可能在不同情况下想指定不同的实体集。例如期望确定的实体仅仅可用在如果用户有一个管理员权限时。为了支持这种需求,模型可能有一个或者多个配置。每一个配置被命名并且有一个相关联的实体集。集合可能是重叠的。你程序建立配置通过使用 setEntities(_:forConfigurationName:)
方法或使用 Xcode 设计工具 ,并且索引实体通过被给定的配置名称使用 entities(forConfigurationName:)
方法。
改变模型
由于模型描述了一个持久化数据库的数据结构,改变模型中的任何部分会使架构渲染和老的被创建的数据库不兼容。如果你改变架构,因此你就需要迁移已经存在的数据库的数据到一个新的版本(查看 Core Data 数据模型版本和数据迁移指南)例如你添加一个新的实体或添加一个新的属性到已经存在的实体,你就不能在打开旧的数据库了,如果你添加了一个验证约束或对一个属性设置了默认值,你就能打开旧的数据库。
在运行时编辑模型
管理对象模型是可以编辑的直到他们被使用做一个对象图形管理者(一个被管理对象上下文或者持久数据库协调器)。这允许你创建或者修改他们知道第一次被使用。然而一旦一个模型被使用,它就不能在被更改了。这在运行时被强制执行--当被管理对象管理者第一次被使用拉去数据使用模型或者它的子对象在这个关键节点之后就会抛出异常。如果你需要修改正在使用中的模型,创建并且修改一个拷贝,并且撤销旧模型的对象。
通过快速枚举去枚举实体
在 macOS 10.15 及其之后或者 iOS 中,** NSManagedObjectModel** 支持 NSFastEnumeration 协议, 你能使用它去枚举模型的实体,正如以下例子所示:
NSManagedObjectModel *aModel = ...;
for (NSEntityDescription *entity in aModel) {
// entity is each instance of NSEntityDescription in aModel in turn
}
主题
初始化一个模型
init?(contentsOf: URL)
通过一个指定 URL 的模型文件初始化一个被管理对象的模型
init()
初始化一个空的被管理对象的模型
class func mergedModel(from: [Bundle]?) -> NSManagedObjectModel?
返回一个被创建的模型在给定的包中合并所有找到的模型
class func mergedModel(from: [Bundle]?, forStoreMetadata: [String : Any]) -> NSManagedObjectModel?
返回一个被创建的模型在通过一个指定不同版本版信息数据源的数组
init?(byMerging: [NSManagedObjectModel]?)
返回一个被创建的模型从已经存在模型的数组
init?(byMerging: [NSManagedObjectModel], forStoreMetadata: [String : Any])
Returns, for the version information in given metadata, a model merged from a given array of models.
检查实体以及配置
var entities: [NSEntityDescription]
The entities in the model.
模型中存在的实体
var entitiesByName: [String : NSEntityDescription]
模型中的实体以名字为键
var configurations: [String]
模型中所有可用配置的名称数组
func entities(forConfigurationName: String?) -> [NSEntityDescription]?
通过指定配置名得到模型中的实体
func setEntities([NSEntityDescription], forConfigurationName: String)
为模型关联实体通过指定配置名
获得拉去请求模版
var fetchRequestTemplatesByName: [String : NSFetchRequest<NSFetchRequestResult>]
一个拉去请求模版的字典以名字为键
func fetchRequestTemplate(forName: String) -> NSFetchRequest<NSFetchRequestResult>?
返回一个拉去请求通过指定的名字
func fetchRequestFromTemplate(withName: String, substitutionVariables: [String : Any]) -> NSFetchRequest<NSFetchRequestResult>?
Returns a copy of the fetch request template with the variables substituted by values from the substitutions dictionary.
func
setFetchRequestTemplate(NSFetchRequest<NSFetchRequestResult>?, forName: String)
Associates the specified fetch request with the receiver using the given name.
管理本地化
var localizationDictionary: [String : String]?
The localization dictionary of the model.
处理版本和迁移
func isConfiguration(withName: String?, compatibleWithStoreMetadata: [String : Any]) -> Bool
Returns a Boolean value that indicates whether a given configuration in the model is compatible with given metadata from a persistent store.
var entityVersionHashesByName: [String : Data]
A dictionary of the version hashes for the entities in the model, keyed by entity name.
var versionIdentifiers: Set<AnyHashable>
The set of developer-defined version identifiers for the model.
使用索引
enum NSFetchIndexElementType
定义索引元素可能的类型
class NSFetchIndexDescription
索引的描述
class NSFetchIndexElementDescription
索引元素的描述