여러개의 store 사용
필요성
사용방법
let container = NSPersistentCloudKitContainer(name: "CloudKitContainer")
let local = NSPersistentStoreDescription(url: URL(fileURLWithPath: "/files/local.sqlite"))
local.configuration = "Local"
let cloud = NSPersistentStoreDescription(url: URL(fileURLWithPath: "/files/cloud.sqlite"))
cloud.configuration = "Cloud"
cloud.cloudKitContainerOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "iCloud.com.wwdc.memo")
let shared = NSPersistentStoreDescription(url: URL(fileURLWithPath: "/files/shared.sqlite"))
shared.configuration = "Shared"
shared.cloudKitContainerOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "iCloud.com.wwdc.shared")
container.persistentStoreDescriptions = [ local, cloud, shared ]
CloudKit Schema와의 사용
record type과 entity name
@objc(Post)
public class Post: NSManagedObject {
@NSManaged public var title: String?
@NSManaged public var content: String?
@NSManaged public var attachment: NSSet?
@NSManaged public var tags: NSSet?
}
// CD_: Core Data가 CloudKit이 관리하는 영역과의 분리를 위해 붙이는 접두사
<CKRecord: 0x7fd0b2539220; recordID=Post_UUID, values={
"CD_content" = "An example core data string";
"CD_content_ckAsset" = "<CKAsset: 0x7fd0b2515c20;...>";
"CD_title" = "An example core data string";
"CD_title_ckAsset" = "<CKAsset: 0x7fd0b240bd40;...>";
"CD_entityName" = Post; // 실제 entity와의 연결 다리. 이를 통해서 entity inheritance 구현이 가능하다.
}, recordType=CD_Post //
Asset Externalization
Relationships
many-to-one
@objc(Attachment)
public class Attachment: NSManagedObject {
@NSManaged public var post: Post?
}
<CKRecord: 0x7fd0b4011bf0; recordID=Attachment_UUID, values={
"CD_entityName" = Attachment;
"CD_imageData" = "ImageData_UUID";
"CD_post" = "Post_UUID";
"CD_uuid" = "...";
}, recordType=CD_Attachment>
many-to-many
@objc(Tag)
public class Tag: NSManagedObject {
@NSManged public var posts: NSSet?
}
<CKRecord: 0x7fd0b2419da0; recordID=Tag_UUID, values={
"CD_color" = {length = 17, bytes = 0x...};
"CD_color_ckAsset" = "<CKAsset: 0x7fd0b2532de0; ...>";
"CD_name" = "An example Core Data string";
"CD_name_ckAsset" = "<CKAsset: 0x7fd0b24215d0;...>";
"CD_uuid" = "..."
"CD_entityName" = Tag;
}, recordType=CD_Tag>
// CDMR: Core Data Mirrored Relationship
// Join된 테이블을 만들어 놓는 것과 같다.
<CKRecord: 0x7fd0b24202f0; recordID=CDMR_UUID, values={
"CD_entityNames" = "Post:Tag";
"CD_recordNames" = "Post_UUID:Tag_UUID";
"CD_relationships" = "tags:posts"
}, recordType=CDMR>
협업을 위한 데이터 모델링