如何建模我的CloudKit数据

问题描述 投票:2回答:1

在我的应用中,我决定使用CloudKit作为我的同步后端。我的应用程序不是关于项目,但为了简单起见,我们这样说......

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

所有这些数据都将存储在用户专用数据库中。公共数据库中没有任何内容。

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

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

接下来,我希望用户能够与其他人共享他的所有数据。目前的问题是,由于项目目前是我数据库中的根记录,我需要为每个项目创建一个共享,对吧?!?在我的应用程序中,单独邀请用户访问每个项目并没有多大意义,所以我想以某种方式存档它。是否有意义,创建一个新的根记录,将项目作为孩子,然后用户会邀请某人到这个新的根记录?

最后的问题......是否有像Sack-Team这样的东西可以提出有关CloudKit的问题?似乎比在stackoverflow上开始一个新问题更容易,因为我的问题非常特定于我的应用...

ios swift icloud cloudkit cloudkit-sharing
1个回答
3
投票

好问题。这是我推荐的。

首先,您只需要一个区域。但要分享它的记录,它必须是一个自定义区域(你不能使用_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的一个好处是你可以在记录之间创建关系。这意味着您可以自动共享根记录的子项,而无需为每个子项单独设置CKShares。

下面是一个示例,介绍如何在记录上设置这些字段。

//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)

所有这一切都预示着你为ProjectTask记录类型的name(类型:String)创建字段。然后在Task记录类型上,你将有一个project类型的Reference字段。

我希望这有帮助,至少会让你开始。我不知道CloudKit Slack频道,但如果你听说过一个,请告诉我! :)

© www.soinside.com 2019 - 2024. All rights reserved.