保存到私有数据库中的自定义区域后,无法保存到Cloudkit公共数据库

时间:2018-01-10 05:25:38

标签: ios swift cloudkit

晚上好,

我遇到了在尝试将记录保存到公共数据库时从Cloudkit获取以下错误消息的问题:

"Server Rejected Request" (15/2027); server message = "Custom zones are not allowed in public DB";

我能够找到导致此错误的问题。在这个应用程序中,我需要在私有数据库上获取区域更改,因此我必须将我的记录保存到自定义区域才能完成该提取。

以下代码是我保存到私有数据库的自定义区域的地方:

    let zoneID = CKManager.defaultManager.sharedZone?.zoneID

    let deckSetToBeSaved = deckName.deckToCKRecord(zoneID)

    privateDatabase.save(deckSetToBeSaved) { (record, error) in

        DispatchQueue.main.async {
            if let record = record {
                deckName.cKRecordToDeck(record)

                try? self.managedContext.save()

            }
         }

        print("New record saved")
        print(error as Any)

    }
}

以下是我将记录保存到公共数据库的代码:

func shareDeckPlan(_ deck: Deck, completion: @escaping (Bool, NSError?) -> Void ) {

  var records = [CKRecord]()

  let deckRecord = deck.deckToCKRecord()
  records.append(deckRecord)

  let reference = CKReference(record: deckRecord, action: .deleteSelf)

  for index in deck.cards {
    let cardRecord = index.cardToCKRecord()
    cardRecord["deck"] = reference
    records.append(cardRecord)

  }

  let operation = CKModifyRecordsOperation(recordsToSave: records,  recordIDsToDelete: nil)

  operation.modifyRecordsCompletionBlock = {(savedRecords, deletedIDs, error) in

    if error == nil {

        DispatchQueue.main.async(execute: {

            if let savedRecords = savedRecords {

                for record in savedRecords {
                    if record.recordID.recordName == deck.ckRecordID {
                        deck.cKRecordToDeck(record)

                    }

                    for cards in deck.cards {
                        if record.recordID.recordName == cards.ckRecordID {
                            cards.ckRecordToCard(record)
                        }

                    }

                }

            }

            let _ = try? self.managedContext.save()

            DispatchQueue.main.async(execute: {

                completion(true, error as NSError?)

            })
        })

    } else {

        DispatchQueue.main.async(execute: {

            print(error!)

            completion(false, error as NSError?)

        })

     }

  }


 operation.qualityOfService = .userInitiated

 self.publicDatabase.add(operation)

}

以下代码引用了deckToCKRecord方法:

 func deckToCKRecord(_ zoneID:CKRecordZoneID? = nil) -> CKRecord {

    let deckSetName: CKRecord

    if let ckMetaData = ckMetaData {
        let unarchiver = NSKeyedUnarchiver(forReadingWith: ckMetaData as Data)
        unarchiver.requiresSecureCoding = true
        deckSetName = CKRecord(coder: unarchiver)!
    }

    else {

        if let zoneID = zoneID {
           deckSetName = CKRecord(recordType: "Deck", zoneID: zoneID)
           self.ckRecordID = deckSetName.recordID.recordName
        } else {
            deckSetName = CKRecord(recordType: "Deck")
            self.ckRecordID = deckSetName.recordID.recordName
        }

    }

    deckSetName["name"] = name! as CKRecordValue
    deckSetName["cardCount"] = cards.count as CKRecordValue

    return deckSetName
}

如何将记录既保存到自定义区域中的私有数据库又成功保存到公共数据库?

0 个答案:

没有答案