2016-06-03 4 views
0

내 사용자 record ID을 설정하여 레코드를 만들 때 CKRecordID을 만들 때마다 오류가 계속 발생하기 때문에 분명히 오류를 표시 할 수 없습니다. 각 사용자의 고유 한 recordID을 레코드 이름으로 사용할 수 없으면 먼저 이름을 설정하는 것이 무엇입니까? 또한 데이터를 가져올 때 사용자를 어떻게 구별합니까?CKRecordID를 생성 할 때 사용자 레코드 ID를 사용하여 레코드 이름을 할당 할 수 있습니까?

CKRecordID *artworkRecordID = [[CKRecordID alloc] initWithRecordName:RANDOM_UNIQUE_NUMBER]; 
     CKRecord *artworkRecord = [[CKRecord alloc] initWithRecordType:@"person" recordID:recordID]; 
     artworkRecord[@"language"] = @"English"; 

     CKContainer *myContainer = [CKContainer defaultContainer]; 
     CKDatabase *privateDatabase = [myContainer privateCloudDatabase]; 
     [privateDatabase saveRecord:artworkRecord completionHandler:^(CKRecord *artworkRecord, NSError *error){ 
      if (!error) { 
       NSLog(@"Success!"); 
      } 
      else { 
       NSLog(@"Failure!"); 
      } 
     }]; 

편집

나는 그것을 밖으로 근무했습니다. 그래서 데이터를 저장/추가 할 때 자신의 사용자 레코드 ID를 사용하여 PRIVATE DATA로부터 자신 만의 데이터를 얻을 수 있으므로 레코드 이름은 전혀 중요하지 않으므로 @ "무엇이든"으로 설정할 수 있습니다. 전혀 문제가되지 않는다.

아직 몇 가지 사항을 이해하지 못합니다.

데이터를 가져 오기 위해 개인 데이터를 사용하지 않을 때 개인 데이터의 레코드 이름을 설정해야하는 이유는 무엇입니까?

-(void)fetchRecord { 
CKDatabase *privateDatabase = [[CKContainer defaultContainer] privateCloudDatabase]; 
CKReference *reference = [[CKReference alloc] initWithRecordID:self.cloudRecordID action:CKReferenceActionNone]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"creatorUserRecordID = %@", reference]; 
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"person" predicate:predicate]; 
[privateDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) { 
    if (error) { 
     NSLog(@"error: %@",error.localizedDescription); 
    } 
    else { 
     if (![results firstObject]) { 
     } 
     else { 
      for (CKRecord *record in results) { 
       NSLog(@"%@",[record objectForKey:@"language"]); 
      } 
     } 
    } 
}];} 

답변

1

작동하지 않습니다. 레코드 ID를 가져 오지 않고 기존 레코드를 업데이트하기위한 레코드 ID 설정은 없습니다. 따라서 "인물"을 만들어 CKRecordID (또는 이름과 존)를 NSUserDefaults 나 사설 클라우드 데이터베이스에 저장할 수 있습니다. 또는 UUID를 person 개체에 저장하면 장치별로 사람을 식별 할 수 있습니다.

사용자를 구분할 필요가 없습니다. 개인 공간에서 작업하는 경우 이는 사용자에게만 해당되며 다른 사용자의 데이터는 볼 수 없습니다. 그리고 공공 장소에서 모두는 앱의 모든 사용자에게 속합니다. (CKContainer privateCloudDatabase 및 publicCloudDatabase 참조)

소지품을 공용으로 처리하려면 자체 속성을 사용하십시오.

+0

아, 사실 개인 데이터로 저장하고 있습니다. 따라서 공공 장소가 아닌 개인 사무실에서 일할 때 올바른 사용자인지 여부를 확인할 필요가 없습니다. CloudKit에 관한 Apple의 문서를 읽었지만 그 문제에 대해서는 언급하지 않았습니다. 또한, 심지어는 아무 문제가 없기 때문에 임의로 생성 된 문자열을 레코드 이름으로 지정해야합니다. – durazno

+0

문서에서 : "데이터베이스 액세스는 기본적으로 해당 iCloud 계정의 사용자로 제한됩니다. 현재 사용자는 개인 데이터베이스의 모든 컨텐츠를 소유하며 해당 내용을 읽고 쓸 수 있습니다. 개인 데이터베이스의 데이터는 표시되지 않습니다. 개발자 포털 또는 다른 사용자에게. " https://developer.apple.com/library/ios/documentation/CloudKit/Reference/CKContainer_class/index.html#//apple_ref/occ/instp/CKContainer/privateCloudDatabase –

+0

글쎄, 그래서 당신이 말하는 것은 개인 날짜에 대해서는 고유 레코드 이름은 무의미하지만 여전히 데이터를 가져 오는 데는 어떤 데이터가 어떤 사용자인지 식별해야합니다. 그렇다면 자신의 사용자 만 액세스 할 수있는 개인 데이터의 모든 부분은 도움이되지 않습니다. 각 사용자에 대해 가져올 데이터를 찾으려면 고유 한 레코드 이름을 설정해야합니다. – durazno