在 CloudKit 中获取私有用户记录

Posted

技术标签:

【中文标题】在 CloudKit 中获取私有用户记录【英文标题】:Getting Private User Record in CloudKit 【发布时间】:2015-09-29 00:21:26 【问题描述】:

我正在尝试在 CloudKit 中获取用户保存的数据。我可以在 CloudKit 仪表板中看到记录,但无法通过应用程序中的代码访问它。

-(void)getUserRecordID 
    CKContainer *defaultContainer =[CKContainer defaultContainer];
    [defaultContainer fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) 
        if (!error) 

            [defaultContainer fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) 
                 self.userRecordID = recordID;
                NSLog(@"user record id: %@",recordID);
                [self getUserRecord];

            ];

       
        else 
            NSLog(@"error: %@",error.localizedDescription);
        
    ];



-(void)getUserRecord 
    CKContainer *defaultContainer =[CKContainer defaultContainer];   
    CKDatabase *publicDatabase = defaultContainer.publicCloudDatabase;
    [publicDatabase fetchRecordWithID:self.userRecordID completionHandler:^(CKRecord *userRecord, NSError *error) 
        if (!error) 
            NSLog(@"current coins: %@",userRecord);


        
        else 
            NSLog(@"error: %@",error.localizedDescription);
        
    ];

这会获取用户记录信息,但不会获取已保存私人记录的 ID。我怎样才能得到它们?

【问题讨论】:

与您希望它做的相比,澄清您发布的代码的作用和不作用。 它确实获取了当前用户的用户记录。它不会获取保存在该用户私有容器中的数据,也不会获取私有记录的 RecordID。 您的代码不会尝试读取其他记录,只读取用户记录。 我希望我能获得私人记录或其他东西的 ID。但我在文档中找不到任何说明如何去做的事情...... 您应该阅读CloudKit Quick Start 指南。 【参考方案1】:

想出了解决办法。您必须使用 CKQuery 和 NSPredicate 查询私有记录。

-(void)getUserRecordID 
    CKContainer *defaultContainer =[CKContainer defaultContainer];
    [defaultContainer fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) 
        if (!error) 
            self.userRecordID = recordID;
            NSLog(@"user record id: %@",recordID.recordName);
            [self getStatsRecord];
        
        else 
            NSLog(@"error: %@",error.localizedDescription);
        
    ];



-(void)getStatsRecord 
    CKDatabase *privateDatabase = [[CKContainer defaultContainer] privateCloudDatabase];
    CKReference *reference = [[CKReference alloc] initWithRecordID:self.userRecordID action:CKReferenceActionNone];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"creatorUserRecordID = %@", reference];
    CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Stats" predicate:predicate];
    [privateDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) 
        if (error) 
            NSLog(@"error: %@",error.localizedDescription);
        
        else 
            if (![results firstObject]) 
                [self createBlankRecord];
            
            else 
                CKRecord *record = [results firstObject];
                NSLog(@"%@",record);
            
        
    ];


【讨论】:

以上是关于在 CloudKit 中获取私有用户记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在私有数据库 CloudKit 中获取 RecordType 的所有名称

CloudKit,NSPredicate在私有容器中返回计数或确定是否存在任何记录?

CloudKit 私有数据库返回前 100 个 CKRecords

CloudKit,NSPredicate 在私有容器中返回计数或确定是不是存在任何记录?

如何在 CloudKit 中存储对共享记录的引用

私有数据库和订阅的 Cloudkit 问题?