如果由于某种原因您不喜欢使用Xcode GUI创建coreData模型的过程,或者您像程序员一样疯狂,因为我希望您的应用程序摆脱.XCDataModel文件并加快运行速度,那么欢迎您。
简要背景
大约半年前,我一直在开发自己的iOS应用程序,直到最近,开发过程一直顺利进行,并且在数据存储领域没有任何问题。
但是最近,从我的角度来看,coreData模型的大小已经变得不合理了,而且由于我是盲人,因此在处理大量半可视数据方面对我来说实际上是困难的,因此我决定将与coreData有关的所有内容都转移到代码中。
关于coreData的“非可视”工作的材料很少,因此我的结论和发展的一半是基于在Playgrounds上进行的疯狂实验,以及对Google缺失信息的疯狂尝试。
一般来说,我们走吧!
让我们从类开始。
如果在与coreData的标准合作中,我们用模型在一个单独的文件中描述了所有实体及其之间的关系,那么在我们的情况下,我们将需要首先描述这些实体的类(这样会更容易理解我们正在使用的对象,而Xcode会有所帮助,提示已经创建的类的名称)。
顺便说一下,下面我们将在每个类的末尾使用一个奇怪的后记“ MO”-受管对象。请勿将其与其他可能类似的类混淆,但不要与coreData相关。
我们将描述以下情况:
- 有一家公司(由CompanyMO类描述);
- 有员工(由WorkerMO类描述);
- 每个员工只能在一个公司工作(或根本不工作);
- 每个公司可以有任意数量的员工(完全没有员工)。
@objc(CompanyMO)
public class CompanyMO: NSManagedObject {
@NSManaged public var companyName: String
@NSManaged public var workers: NSSet
}
@objc(WorkerMO)
public class WorkerMO: NSManagedObject {
@NSManaged public var firstname: String
@NSManaged public var lastname: String
@NSManaged public var company: CompanyMO?
}
.
objc() — , , .
objc(CompanyMO) CompanyMO , CompanyMO Objective-C CompanyMO. objc(NameOfClass) Objective-C.
— @NSManaged .
@NSManaged , , . , ( Apple, ), @NSManaged coreData.
— , .
, , extension .
extension NSEntityDescription {
convenience init(from classType: AnyClass) {
self.init()
self.name = NSStringFromClass(classType)
self.managedObjectClassName = NSStringFromClass(classType)
}
func addProperty(_ property: NSPropertyDescription) {
self.properties.append(property)
}
}
extension NSAttributeDescription {
convenience init(name: String, ofType: NSAttributeType, isOptional: Bool = false) {
self.init()
self.name = name
self.attributeType = ofType
self.isOptional = isOptional
}
}
.
NSEntityDescription — coreData, (, ). ( , ) (managedObjectClassName), , (, — CompanyMO, WorkerMO ).
, :
let company = NSEntityDescription()
company.name = "CompanyMO"
company.managedObjectClassName = "CompanyMO"
, , NSEntityDescription. , :
let company = NSEntityDescription(from: CompanyMO.self)
let worker = NSEntityDescription(from: WorkerMO.self)
, , .
( , ), .
var model: NSManagedObjectModel {
let _model = NSManagedObjectModel()
let companyEntity = NSEntityDescription(from: CompanyMO.self)
companyEntity.addProperty(NSAttributeDescription(name: "companyName", ofType: .stringAttributeType))
let workerEntity = NSEntityDescription(from: WorkerMO.self)
workerEntity.addProperty(NSAttributeDescription(name: "firstname", ofType: .stringAttributeType))
workerEntity.addPropertyNSAttributeDescription((name: "lastname", ofType: .stringAttributeType))
_model.entities = [companyEntity, workerEntity]
return _model
}
.
NSManagedObjectModel entities, NSEntityDescription.
NSManagedObjectModel.entities: [NSEntityDescription]
NSEntityDescription . , , - . , , .
NSEntityDescription , companyEntity workerEntity companyEntity.properties workerEntity.properties, NSPropertyDescription.
NSPropertyDescription NSAttributeDescription ( , , ) NSRelationshipDescription ( ).
NSRelationshipDescription .
, :
- CompanyMO WorkerMO;
- , . companyEntity companyName ( workers ), workerEntity firstname lastname.
- entities "" .
.
.
NSPersistentStore NSPersistentStoreCoordinator NSPersistentContainer (, . ).
coreData .
, ( ) .
persistentContainer .
lazy var persistentContainer: NSPersistentContainer {
let _container = NSPersistentContainer(name: "CyrmaxModel", managedObjectModel: model)
_container.loadPersistentStores {
(description, error) in
}
return _container
}
, ( ) , .
persistentContainer coreData , .
- , ;
- (- - , );
- ( , "?", ).
, , , , , .
, .
, .
WorkerMO, .
@objc(WorkerMO)
public class WorkerMO: NSManagedObject {
@NSManaged public var firstname: String
@NSManaged public var lastname: String
static private var _entityDescription: NSEntityDescription?
static func entityDescription() -> NSEntityDescription {
guard self._entityDescription == nil else {
return _entityDescription!
}
let des = NSEntityDescription(from: self)
des.addProperty(NSAttributeDescription(name: "firstname", ofType: .stringAttributeType))
des.addProperty(NSAttributeDescription(name: "lastname", ofType: .stringAttributeType))
self._entityDescription = des
return self._entityDescription!
}
}
CompanyMO ( ).
.
_entityDescription , ?
, NSRelationshipDescription .
, , CompanyMO.entityDescription() NSEntityDescription, .
coreData- — . , . ( , StoryBoard, ), .
- , , StoryBoard, XCDataModel.
- NSManagedObjectModel;
- NSEntityDescription;
- NSPropertyDescription NSAttributeDescription;
- 可选,但是您仍然可以阅读有关NSPersistentContainer及其初始化(名称:managedObjectModel :)初始化程序的信息。