将多个字段添加到 CloudKit 中的同一记录名称行

Posted

技术标签:

【中文标题】将多个字段添加到 CloudKit 中的同一记录名称行【英文标题】:Add multiple fields to the same recordName row in CloudKit 【发布时间】:2017-08-03 14:12:57 【问题描述】:

我正在尝试将多个值保存到 CloudKit(名称、用户名、积分)。但是,当我保存它们时,它们分别保存在 3 个不同的行中,如下所示:

我想将 Name、Username 和 Points 字段合并为一行,以便将它们一起加载。

这是我的保存代码:

func saveToCloud()
    let newName = CKRecord(recordType: "LeaderboardInfo")
    newName.setValue(firstName, forKey: "Name")
        database.save(newName)  (record, error) in
        guard record != nil else  return 
        print("saved record")
    
    let newUsername = CKRecord(recordType: "LeaderboardInfo")
    newUsername.setValue(username, forKey: "Username")

    database.save(newUsername)  (record, error) in
        guard record != nil else  return 
        print("saved record")
    
    let pointsCount = CKRecord(recordType: "LeaderboardInfo")
    pointsEarned = Int(arc4random_uniform(UInt32(50)))
    pointsCount.setValue(pointsEarned, forKey: "Points")

    database.save(pointsCount)  (record, error) in
        guard record != nil else  return 
        print("saved record")
    

有人可以演示如何将这些记录保存在一起而不是单独保存吗?

除此之外,我目前在它们应该放在一起时单独加载它们......正在加载代码:

 func queryDatabase() 
    // Name
    let query = CKQuery(recordType: "LeaderboardInfo", predicate: NSPredicate(value: true))
    database.perform(query, inZoneWith: nil)  (records, _) in
        guard let records = records else  return 
        let sortedRecords = records.sorted(by:  $0.creationDate! > $1.creationDate! )
        self.names = sortedRecords
        DispatchQueue.main.async 
            //  self.tableView.refreshControl?.endRefreshing()
              self.tableView.reloadData()
        
    
    // Username
    let query2 = CKQuery(recordType: "LeaderboardInfo", predicate: NSPredicate(value: true))
    database.perform(query2, inZoneWith: nil)  (records, _) in
        guard let records = records else  return 
        let sortedRecords = records.sorted(by:  $0.creationDate! > $1.creationDate! )
        self.usernames = sortedRecords
        DispatchQueue.main.async 
            //  self.tableView.refreshControl?.endRefreshing()
              self.tableView.reloadData()
        
    
    // Points
    let query3 = CKQuery(recordType: "LeaderboardInfo", predicate: NSPredicate(value: true))
    database.perform(query3, inZoneWith: nil)  (records, _) in
        guard let records = records else  return 
        let sortedRecords = records.sorted(by:  $0.creationDate! > $1.creationDate! )
        self.points = sortedRecords
        DispatchQueue.main.async 
            //  self.tableView.refreshControl?.endRefreshing()
              self.tableView.reloadData()

        
    

我希望在保存和加载过程中将我的数据组合在一起。

附:如果它可以帮助任何人更好地理解,我正在尝试制作一个包含所有用户姓名或用户名以及他们的积分的公共排行榜。

【问题讨论】:

【参考方案1】:

您正在创建 3 条单独的记录并在每条记录上设置一个字段,一个不同的字段。相反,只需创建 1 条记录并在其上设置所有 3 个字段。试试这样的东西(我对 SWIFT 的速度不是很了解,所以您可能需要稍微了解一下语法)

func saveToCloud()

    let newRecord = CKRecord(recordType: "LeaderboardInfo")

    newRecord.setValue(firstName, forKey: "Name")
    newRecord.setValue(username, forKey: "Username")

    pointsEarned = Int(arc4random_uniform(UInt32(50)))
    newRecord.setValue(pointsEarned, forKey: "Points")

    database.save(newRecord)  (record, error) in
        guard record != nil else  return 
        print("saved record")
    

【讨论】:

以上是关于将多个字段添加到 CloudKit 中的同一记录名称行的主要内容,如果未能解决你的问题,请参考以下文章

将 CloudKit 记录保存到本地文件保存除 CKAsset 之外的所有字段

Cloudkit 的 NSPredicate 匹配字符串

CloudKit 谓词:使用 CKQuery 的谓词搜索多个参考字段

如何使用objective-c从CloudKit中的资产字段中检索图像

Cloudkit 中的即时模式

swift Swift - CloudKit - 添加保存删除多个记录