ios - 如何对我的 CloudKit 数据建模

标签 ios swift icloud cloudkit cloudkit-sharing

在我的应用程序中,我决定使用 CloudKit 作为我的同步后端。 我的应用程序与项目无关,但为了简单起见,我们可以这么说......

所以...在我的应用程序中,用户将有多个项目。其中每个都包含与该项目关联的多个实体。例如任务,还有提醒等等。

所有这些数据都将存储在用户的私有(private)数据库中。公共(public)数据库中不会有任何内容。

现在一个用户可以拥有多个项目。

我的第一个问题: 每个项目都应该位于它自己的 CKRecordZone 中吗?我没有看到这样做的好处?!?有人可以向我解释一下拥有多个记录区的好处是什么吗?所以目前所有项目都在 ONE 区域中。

接下来,我希望用户能够与其他人共享他的所有数据。目前的问题是,由于该项目当前是我数据库中的根记录,我需要为每个项目创建一个共享,对吗?!?在我的应用程序中,单独邀请用户加入每个项目实际上没有意义,因此我想以某种方式对其进行存档。 创建一个将项目作为子项目的新根记录,然后用户邀请某人加入这个新根记录是否有意义?

最后一个问题...是否有类似 Sack-Team 之类的机构可以询问有关 CloudKit 的问题?似乎比在 stackoverflow 上开始一个新问题更容易,因为我的问题非常针对我的应用程序......

最佳答案

好问题。这是我的推荐。

区域

首先,您只需要一个区域。但要共享其中的记录,它必须是自定义区域(您不能使用_defaultZone)。老实说,CloudKit 中的区域很奇怪,我不确定它们为什么存在。苹果似乎正在将数据库分片的挑战转嫁给他们的开发人员。 :)

创建一个像这样的自定义区域:

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)")
  }
}

记录类型

我会创建这样的记录类型:

  • 项目(根记录)
  • 任务
  • 提醒

分享

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)

所有这些都假设您为 nameProjectTask 记录类型创建字段(类型:String)。然后,在 Task 记录类型上,您将拥有一个 Reference 类型的 project 字段。

我希望这对您有所帮助,并且至少可以帮助您入门。我不知道 CloudKit Slack channel ,但如果您听说过,请告诉我! :)

关于ios - 如何对我的 CloudKit 数据建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52058053/

相关文章:

ios - UIStackView 隐藏内部 View 时分布填充相等

ios - 如何从 cloudkit 接收图像?

objective-c - 如何正确重置应用程序的 iCloud 存储

ios - registerForRemoteNotifications 方法未被正确调用

ios - 工厂类 - 停止初始化

ios - 在 WatchKitExtension 中混合 swift 和 objective-c

ios - 在 iOS 上原生渲染 UILabel/UITextfield 中的 LaTeX 代码

ios - 滚动到特定标题 View

ios - Apple 批准将所有用户数据(包括图像)保存到 iCloud

ios - ML 套件人脸识别不适用于 IOS