首页 > 解决方案 > 在 CloudKit 中共享父记录时,子记录未显示在共享数据库中

问题描述

我有一个应用程序,我可以与其他用户共享记录,当我共享一条记录时一切正常,我的问题是当我共享一条有子记录引用它的记录(父记录)时,我可以在Shared Databasein 中看到父记录用户接受共享后的 CloudKit 仪表板,但我没有看到任何相关的子记录。

根据 WWDC 视频和 Stack Overflow 上的其他一些线程,当您共享父记录时,子记录会自动共享,但这不是我所看到的,再次,我可以在Shared Database但没有子记录中看到父记录.

以下是如何在CloudKit Dashboard.

在 CloudKit 仪表板中,我有一个Lists和一个Items记录类型,其中Lists记录是一个或多个的父级Items。在Items模式中,我有一个Reference字段类型,它保留对其父列表的引用。

这是我用来保存父记录的代码。

func shareList(){        
    let share = CKShare(rootRecord: self.list)

    if let listName = self.list.object(forKey: "name") as? String {
        self.listName = self.list.object(forKey: "name") as? String
        share[CKShare.SystemFieldKey.title] = "Sharing \(listName)" as CKRecordValue?

    } else {
        share[CKShare.SystemFieldKey.title] = "" as CKRecordValue?
    }
    share[CKShare.SystemFieldKey.shareType] = "com.mySite.lists" as CKRecordValue

    let sharingViewController = UICloudSharingController(preparationHandler: {(UICloudSharingController, handler: @escaping (CKShare?, CKContainer?, Error?) -> Void) in
        let modRecordsList = CKModifyRecordsOperation(recordsToSave: [self.list, share], recordIDsToDelete: nil)

        modRecordsList.modifyRecordsCompletionBlock = {
            (record, recordID, error) in

            handler(share, CKContainer.default(), error)
        }
        CKContainer.default().privateCloudDatabase.add(modRecordsList)
    })

     sharingViewController.delegate = self
     sharingViewController.availablePermissions = [.allowPrivate]
     self.navigationController?.present(sharingViewController, animated:true, completion:nil)
}

我错过了什么?共享父记录时我需要做任何额外的设置吗?

我说得对,子记录应该自动与父记录单独共享?

这是一张图片,展示了项目和列表之间的关系在Private Database.

在此处输入图像描述

标签: iosswifticloudcloudkit

解决方案


您必须使用以下方法在每个子记录上设置父级setParenthttps ://developer.apple.com/documentation/cloudkit/ckrecord/1690507-setparent

像这样:

childRecord.setParent(parentRecord)

我希望这会有所帮助。


推荐阅读