创建CKRecordID时可以使用用户记录ID来分配记录名吗?
Can we use user record ID to assign record name when creating CKRecordID?
显然我们不能,因为每当我尝试将自己的用户 record ID
设置为创建 CKRecordID
以创建记录时,它都会不断抛出错误。
如果我们不能使用每个用户的唯一 recordID
作为记录名称,那么首先设置其名称有什么意义呢?还有,我们在取数据的时候怎么区分用户?
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!");
}
}];
编辑
我已经解决了。
因此,当您 save/add 数据时,记录名称根本不重要,因为您只能使用自己的用户记录 ID 从 PRIVATE DATA 获取自己的数据,因此您可以将其设置为 @"whatever" 并且它一点都不重要。
有几件事我还是不明白。
当我们甚至不使用它来获取数据时,为什么我们必须为私有数据设置记录名称?
-(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"]);
}
}
}
}];}
无效。设置记录 ID 仅用于更新现有记录而不获取它。因此,您可以创建一个 "person" 并将其 CKRecordID(或名称和区域)保存到您的 NSUserDefaults 或私有云数据库中。
或者你将UUID保存到person对象中,这样你就可以通过设备识别一个人...
您不必区分用户。如果您在私人 space 上工作,它仅供用户使用,您不会看到其他人的数据。在 public space 上,所有内容都属于您应用的所有用户。 (参见 CKContainer privateCloudDatabase 和 publicCloudDatabase)
如果您想处理 public 中的物品,请使用自己的属性。
显然我们不能,因为每当我尝试将自己的用户 record ID
设置为创建 CKRecordID
以创建记录时,它都会不断抛出错误。
如果我们不能使用每个用户的唯一 recordID
作为记录名称,那么首先设置其名称有什么意义呢?还有,我们在取数据的时候怎么区分用户?
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!");
}
}];
编辑
我已经解决了。 因此,当您 save/add 数据时,记录名称根本不重要,因为您只能使用自己的用户记录 ID 从 PRIVATE DATA 获取自己的数据,因此您可以将其设置为 @"whatever" 并且它一点都不重要。
有几件事我还是不明白。
当我们甚至不使用它来获取数据时,为什么我们必须为私有数据设置记录名称?
-(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"]);
}
}
}
}];}
无效。设置记录 ID 仅用于更新现有记录而不获取它。因此,您可以创建一个 "person" 并将其 CKRecordID(或名称和区域)保存到您的 NSUserDefaults 或私有云数据库中。 或者你将UUID保存到person对象中,这样你就可以通过设备识别一个人...
您不必区分用户。如果您在私人 space 上工作,它仅供用户使用,您不会看到其他人的数据。在 public space 上,所有内容都属于您应用的所有用户。 (参见 CKContainer privateCloudDatabase 和 publicCloudDatabase)
如果您想处理 public 中的物品,请使用自己的属性。