如何为我的 CloudKit 数据建模
How to model my CloudKit data
在我的应用程序中,我决定使用 CloudKit 作为我的同步后端。
我的应用程序与项目无关,但为了简单起见,我们这样说...
所以...在我的应用程序中,用户将有多个项目。其中每一个都包含与该项目关联的多个实体。比如任务,还有提醒等等。
所有这些数据都将存储在用户的私人数据库中。 public 数据库中不会有任何内容。
现在一个用户可以拥有多个项目。
我的第一个问题:
每个项目都应该在它自己的 CKRecordZone 中吗?我没有看到这样做的好处?!?有人可以向我解释拥有多个记录区域的好处是什么吗?所以目前所有的项目都在一个区域。
接下来,我希望用户能够与其他人共享他的所有数据。目前的问题是,由于该项目目前是我数据库中的根记录,我需要为每个项目创建一个共享,对吧?!?在我的应用程序中,单独邀请用户参加每个项目并没有什么意义,所以我想以某种方式将其存档。
创建一个将项目作为子项的新根记录,然后用户会邀请某人加入这个新根记录是否有意义?
最后一个问题...是否有 Sack-Team 之类的人可以提出有关 CloudKit 的问题?似乎比在 Whosebug 上开始一个新问题更容易,因为我的问题非常针对我的应用程序...
好问题。这是我推荐的。
区域
首先,您只需要一个区域。但是要从中共享记录,它必须是 custom 区域(不能使用 _defaultZone
)。老实说,CloudKit 中的区域很奇怪,我不确定它们为什么存在。 Apple 似乎正在将数据库分片挑战转嫁给他们的开发人员。 :)
像这样创建自定义区域:
let customZone = CKRecordZone(zoneName: "projectZone")
// Save the zone in the private database
let container = CKContainer(identifier: "...")
let privateDB = container.privateCloudDatabase
privateDB.save(customZone){ zone, error in
if let error = error{
print("Zone creation error: \(String(describing: error))")
}else{
print("Zone created: \(zone)")
}
}
记录类型
我会像这样创建记录类型:
Project
(根记录)
Task
Reminder
分享
CloudKit 的优点之一是您可以在记录之间创建关系。这意味着您可以自动共享根记录的子项,而无需为每个子项单独设置 CKShare
。
下面的示例演示了如何在记录中设置这些字段。
//Get a reference to the zone you created
let zoneID = CKRecordZoneID(zoneName: "projectZone", ownerName: CKCurrentUserDefaultName)
//Create a project record
let projectRecord = CKRecord(recordType: "Project", zoneID: zoneID)
projectRecord.setValue("My Cool Project", forKey: "name")
//Create a task record
let taskRecord = CKRecord(recordType: "Task", zoneID: zoneID)
taskRecord.setValue("My Task Name", forKey: "name")
//Create an association between the task and its parent project
let parentReference = CKReference(record: projectRecord, action: .deleteSelf)
taskRecord.setValue(parentReference, forKey: "project")
//When sharing, allow this task to be automatically shared if the parent project is shared
taskRecord.setParent(projectRecord)
所有这些都假定您为 Project
和 Task
记录类型 name
(类型:String
)创建字段。然后在 Task
记录类型上,您将有一个 project
类型的字段 Reference
.
希望对您有所帮助,至少可以帮助您入门。我不知道 CloudKit Slack 频道,但如果你听说过一个,请告诉我! :)
在我的应用程序中,我决定使用 CloudKit 作为我的同步后端。 我的应用程序与项目无关,但为了简单起见,我们这样说...
所以...在我的应用程序中,用户将有多个项目。其中每一个都包含与该项目关联的多个实体。比如任务,还有提醒等等。
所有这些数据都将存储在用户的私人数据库中。 public 数据库中不会有任何内容。
现在一个用户可以拥有多个项目。
我的第一个问题: 每个项目都应该在它自己的 CKRecordZone 中吗?我没有看到这样做的好处?!?有人可以向我解释拥有多个记录区域的好处是什么吗?所以目前所有的项目都在一个区域。
接下来,我希望用户能够与其他人共享他的所有数据。目前的问题是,由于该项目目前是我数据库中的根记录,我需要为每个项目创建一个共享,对吧?!?在我的应用程序中,单独邀请用户参加每个项目并没有什么意义,所以我想以某种方式将其存档。 创建一个将项目作为子项的新根记录,然后用户会邀请某人加入这个新根记录是否有意义?
最后一个问题...是否有 Sack-Team 之类的人可以提出有关 CloudKit 的问题?似乎比在 Whosebug 上开始一个新问题更容易,因为我的问题非常针对我的应用程序...
好问题。这是我推荐的。
区域
首先,您只需要一个区域。但是要从中共享记录,它必须是 custom 区域(不能使用 _defaultZone
)。老实说,CloudKit 中的区域很奇怪,我不确定它们为什么存在。 Apple 似乎正在将数据库分片挑战转嫁给他们的开发人员。 :)
像这样创建自定义区域:
let customZone = CKRecordZone(zoneName: "projectZone")
// Save the zone in the private database
let container = CKContainer(identifier: "...")
let privateDB = container.privateCloudDatabase
privateDB.save(customZone){ zone, error in
if let error = error{
print("Zone creation error: \(String(describing: error))")
}else{
print("Zone created: \(zone)")
}
}
记录类型
我会像这样创建记录类型:
Project
(根记录)Task
Reminder
分享
CloudKit 的优点之一是您可以在记录之间创建关系。这意味着您可以自动共享根记录的子项,而无需为每个子项单独设置 CKShare
。
下面的示例演示了如何在记录中设置这些字段。
//Get a reference to the zone you created
let zoneID = CKRecordZoneID(zoneName: "projectZone", ownerName: CKCurrentUserDefaultName)
//Create a project record
let projectRecord = CKRecord(recordType: "Project", zoneID: zoneID)
projectRecord.setValue("My Cool Project", forKey: "name")
//Create a task record
let taskRecord = CKRecord(recordType: "Task", zoneID: zoneID)
taskRecord.setValue("My Task Name", forKey: "name")
//Create an association between the task and its parent project
let parentReference = CKReference(record: projectRecord, action: .deleteSelf)
taskRecord.setValue(parentReference, forKey: "project")
//When sharing, allow this task to be automatically shared if the parent project is shared
taskRecord.setParent(projectRecord)
所有这些都假定您为 Project
和 Task
记录类型 name
(类型:String
)创建字段。然后在 Task
记录类型上,您将有一个 project
类型的字段 Reference
.
希望对您有所帮助,至少可以帮助您入门。我不知道 CloudKit Slack 频道,但如果你听说过一个,请告诉我! :)