2017-09-11 8 views
0

기본 컨테이너의 공용 데이터베이스에 처음으로 저장하려고하는 CKR 코드 배열이 있습니다. 나는 CKModifyRecordsOperation을 생성하고 공용 데이터베이스에 작업을 추가하려고 시도했습니다. 실패했지만 오류 메시지가 표시되지 않습니다. 그래서 나는 각 방법을 데이터베이스에 개별적으로 추가하려고 시도했는데, CKOperation을 수행하지 못했습니다. 또한 성공하지 못했으며 오류 메시지도 없었습니다. 확실히하기 위해 CloudKit 대시 보드를 확인했습니다. 거기에는 아무것도 없다.CloudKit에서 기본 컨테이너의 공용 데이터베이스에 레코드를 저장할 수없는 이유는 무엇입니까?

다음은 문제의 방법입니다. NSWindow의 버튼에 대한 간단한 IBAction에 연결됩니다. 내 모델 데이터에서 CKRecords를 생성하는 중첩 루프를 무시할 수 있습니다. 그들은 예상대로 작동하는 것 같습니다. 내 오류 검사 코드는 CKModifyRecordsOperation의 완료 블록 안에 있습니다. 구체적으로, modifyRecordsCompletionBlock이 인쇄 중입니다 : "CloudKit에 0 개의 레코드를 저장했습니다."

@IBAction func uploadDataToCloudKit(_ sender: NSButton) { 
     // Get CloudKit container and Public Database 
     let myContainer = CKContainer.default() 
     let publicDB = myContainer.publicCloudDatabase 

     // Create array of cloudkit records so we can save a batch 
     var cloudRecords = [CKRecord]() 

     let groups = PayCodes().groups 

     // For each PayCode Group... 
     for payCodeGroup in groups { 
      // Create CKRecord and give it a type 
      let payCodeGroupRecord = CKRecord(recordType: "payCodeData") 

      // For each PayCode in the group... 
      for payCode in payCodeGroup.payCodes { 
       // Fill the new CKRecord with key/value pairs 
       payCodeGroupRecord.setObject(payCodeGroup.title as NSString, forKey: "group") 

       if let commercialID = payCode.id.commercial as NSString?, let residentialID = payCode.id.residential as NSString? { 
        payCodeGroupRecord.setObject(commercialID, forKey: "commercialID") 
        payCodeGroupRecord.setObject(residentialID, forKey: "residentialID") 
       } 

       payCodeGroupRecord.setObject(payCode.title as NSString, forKey: "title") 

       if let description = payCode.description as NSString? { 
        payCodeGroupRecord.setObject(description, forKey: "description") 
       } 

       payCodeGroupRecord.setObject((payCode.includesTripCharge ? 1 : 0) as NSNumber, forKey: "includesTripCharge") 
       payCodeGroupRecord.setObject((payCode.needsResolutionCode ? 1 : 0) as NSNumber, forKey: "needsResolutionCode") 


       payCodeGroupRecord.setObject(payCode.pay.commercial as NSNumber, forKey: "commercialPay") 
       payCodeGroupRecord.setObject(payCode.pay.residential as NSNumber, forKey: "residentialPay") 

       // Save new CKRecord into the Array 
       cloudRecords.append(payCodeGroupRecord) 
      } 
     } 

     print("There are \(cloudRecords.count) records about to be saved...") 
     // print(cloudRecords) 
     // Create an operation to save the records 
     let operation = CKModifyRecordsOperation(recordsToSave: cloudRecords, recordIDsToDelete: nil) 

     operation.perRecordCompletionBlock = { savedRecord, error in 
      guard error != nil else { 
       print("There was an error: \(error!.localizedDescription)") 
       return 
      } 

      print("Saved a record into CloudKit") 
     } 

     operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in 
      guard error != nil else { 
       print("There was an error: \(error!.localizedDescription)") 
       return 
      } 

      guard let savedRecords = savedRecords else { return } 
      print("Saved \(savedRecords.count) records into CloudKit") 
     } 

     // Run the operation 
     publicDB.add(operation) 
//  cloudRecords.forEach { record in 
//   publicDB.save(record) { savedRecord, error in 
//    guard error != nil else { 
//     print("There was an error: \(error!.localizedDescription)") 
//     return 
//    } 
//     
//    guard let savedRecord = savedRecord else { return } 
//    print("Saved a record: \(savedRecord.allKeys())") 
//   } 
//  } 
    } 
+0

당신이 인쇄 문 중 하나를 받고 있습니까? – rmaddy

+0

'CKContainer accountStatus (completionHandler :)'메소드를 사용하여 컨테이너에 대한 액세스를 확인 했습니까? – rmaddy

+0

예, 있습니다 : 사용할 수 있습니다. 다른 한편으로는, 나는 왜 내가 어떤 에러 메시지도 얻지 못했다는 것을 깨달았다. 내가 가드 진술로 바보짓을하고 있었기 때문입니다 ... 부정적인 오류입니다. 이제 수정 했으므로 다음과 같은 오류가 발생합니다. '오류가 발생했습니다 : 동일한 레코드를 두 번 저장할 수 없습니다 : '. 그러나 CloudKit Dashboard를 통해 확인하면 데이터베이스에 저장된 데이터가 없습니다. 어떤 아이디어가 문제 일 수 있습니까? 감사. –

답변

1

중복 레코드 문제는 CKRecord 인스턴스 재사용입니다.

변경 :

for payCodeGroup in groups { 
    // Create CKRecord and give it a type 
    let payCodeGroupRecord = CKRecord(recordType: "payCodeData") 

    // For each PayCode in the group... 
    for payCode in payCodeGroup.payCodes { 
     // Fill the new CKRecord with key/value pairs 
     payCodeGroupRecord.setObject(payCodeGroup.title as NSString, forKey: "group") 

에 :

for payCodeGroup in groups { 
    // For each PayCode in the group... 
    for payCode in payCodeGroup.payCodes { 
     // Create CKRecord and give it a type 
     let payCodeGroupRecord = CKRecord(recordType: "payCodeData") 

     // Fill the new CKRecord with key/value pairs 
     payCodeGroupRecord.setObject(payCodeGroup.title as NSString, forKey: "group") 
+0

아, 친구. 그렇게 많은 의미가 있습니다. 고맙습니다! 그래서 ... 나는 그것을 고쳤다. 그리고 내가 지금 얻고있는 과실은 내가 나의 컨테이너를위한 "BundleId"를 가지고 있다고 말한다. 번들 ID가 있어야하는 특정 형식이 있습니까? 역 DNS 표기법 같은 거요? 다시 한번 감사드립니다. 할 수 있으면 대답을 수락 하겠지만 ... 13 점 만 있습니다. ( –

+0

대답을 수락 할 수 있지만 몇 분을 기다려야 할 수도 있습니다. Rep은 자신의 대답을 수락하는 데 문제가되지 않습니다. 질문. 컨테이너 문제에 대해서는 Xcode의 기본 컨테이너를 사용하도록 앱을 설정하고 있습니까? – rmaddy

+0

알았습니다. 허용됩니다. 예, 기본 컨테이너를 사용하도록 설정 되었습니까? –