icloud之添加参考字段

来源:互联网 发布:域名与ip地址的关系 编辑:程序博客网 时间:2024/05/02 00:20

Adding Reference Fields

使用参考字段架构中的代表模型对象之间的关系;例如,为了表示阶层数据或指示所有权。本章介绍如何将引用添加到记录,保存和提取记录的引用,并指定所有权,以便相关的记录被自动删除。

About Modeling Relationships in Your Schema

关于你的架构建模的关系

可以使用参考字段类型来表示既一到一又一对多模型对象之间的关系。在代码中,一个参考场是封装了记录的ID为目标记录和被添加到源记录一个 CKReference对象。为了表示一个一对一模式中的关系,引用字段添加到源记录类型。

../Art/to_one_relationship_2x.png

为了表示你的模型对象间的一种一对多的关系,它是,如果引用是从孩子的记录到父更有效的记录,也就是说,一个参考字段添加到子记录。子记录是源,而父记录是在此架构中的目标。


例如,有ArtworkArtist的模型,并从ArtworkArtist的模型逆一个一对一关系之间存在一个一对多的关系。

../Art/gallery_object_model_2x.png

为了表示在架构这些关系,引用字段添加到所谓的Artist对应的Artwork记录类型。该参考字段将包含一个Artist的记录的记录ID。

../Art/to_many_relationship_2x.png

同样,代表一个一对多的对象模型,从Artist的关系,收集,参考字段添加到收藏记录。当您获取这些记录,您创建相应的一到一个又一个一对多的模型对象之间的关系。

Create Reference Fields

在开发过程中,保存包含引用域生成模式记录。通过添加CKReference对象到源记录代表一对一的模式中的关系。


创建一个记录到另一个的引用


1.创建或获取目标记录的记录ID。

CKRecordID *artistRecordID = [[CKRecordID alloc] initWithRecordName:@"Mei Chen"];
2.通过将目标的记录ID作为一个参数创建一个参考对象。

CKReference *artistReference = [[CKReference alloc] initWithRecordID:artistRecordID action:CKReferenceActionNone];
3.参考对象添加到源记录。

CKRecord *artworkRecord;
artworkRecord[@"artist"] = artistReference;
保存源记录创建记录类型,如描述Creating a Database Schema by Saving Records。如果你想保存包含它们之间的引用多条记录,所有记录保存在一个操作中,如在 Use a Single Operation to Save and Fetch Multiple Records.CloudKit将确保目标的记录源记录之前被保存。


Verify Your Steps

在CloudKit仪表板,查看记录类型,如描述 View Record Types by Using CloudKit Dashboard.参考字段应该出现在源记录类型。例如,在Artist记录类型的Artwork字段显示为参考字段类型。

../Art/10_verify_reference_record_type_2x.png

查看记录,如在 View Records Using CloudKit Dashboard.目标记录的名字应该出现在源记录。

../Art/10_verify_reference_record_2x.png

Fetch Records with Reference Fields

获取与参考字段的记录

不要使用记录(CKRecord对象)作为模型对象在 Model-View-Controller设计模式中。相反,创建从提取的记录单独的模型对象,尤其是在获取记录包含引用。你的应用程序负责解释记录之间的引用和创建模型对象之间的适当关系。目标记录不是当源记录被取出自动获取。您的应用程序负责根据需要获取目标的记录。有不同的方式来获取根据参考表示关系的类型目标和源的记录。


如果可能的话,分批取解决模型对象之间的关系,如在 Batch Operations to Save and Fetch Multiple Records.

Resolve One-To-One Relationships

一对一的关系,得到从源记录中的参考场和获取相关联的目标的记录。


获取的一对一关系的目标


1.获取引用字段。

CKRecord *artworkRecord;
CKReference *referenceToArtist = artworkRecord[@"artist"];
2.从reference中得到目标ID。

CKRecordID *artistRecordID = artistReference.recordID;
3.获取目标记录。

[publicDatabase fetchRecordWithID:artistRecordID completionHandler:^(CKRecord *artistRecord, NSError *error) {
    if (error) {
        // Failed to fetch record
    }
    else {
        // Successfully fetched record
    }
}];
把你的代码加进 fetchRecordWithID:completionHandler:完成处理程序的参数。例如,添加代码来创建相应的ArtworkArtist对象之间的一对一的关系。

Resolve One-To-Many Relationships

解决一对多关系
对于一个一对多的关系,获取一个父记录的所有孩子纪录在使用谓词一次。您可以获取有父母作为其目标记录的所有记录。


若要获取的一到一对多的关系的孩子记录


1.先从父记录ID(CKRecordID)先前获取和父模型对象。
例如,创建从艺术家记录的艺术家的模型对象。

__block Artist *artist = [[Artist alloc] initWithRecord:artistRecord];
使用__block使您可以稍后访问父对象中的完成处理。
2.创建谓词对象来获取子记录。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@“artist = %@”, artistRecordID];
在你的代码,与子记录中引用字段的名称替换的艺术家,并与父记录ID替换artistRecordID。
注:在谓语格式字符串参数右边的表达可能的值包括 CKRecordCKRecordID和 CKReference 对象。

3.创建指定的记录类型进行搜索查询对象。

CKQuery *query = [[CKQuery alloc] initWithRecordType:@“Artwork” predicate:predicate];
在你的代码中,替换@“Artwork”的子记录类型的名称。
4.执行读取。

CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
[publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {
    if (error) {
        // Failed to fetch children of parent
    }
    else {
        // Create model objects for each child and set the one-to-many relationship from the parent to its children
    }
}];
该代码添加到创建模型对象之间的对应关系else语句。

Batch Operations to Save and Fetch Multiple Records

批处理操作保存和获取多个记录

它是更有效的批量保存和获取的多个记录到单个操作中。这一点尤其重要,如果记录类型包含引用字段。您可以使用CKModifyRecordsOperation对象在一次操作中保存新的源和目标的记录。可以创建一个对不具有标识符的目标记录。只要你保存源和目标记录在一起,CloudKit确保相关CKRecord对象图,目标记录源记录前保存。您也可以使用CKFetchRecordsOperation对象获取一组源记录的所有目标中的一个操作。


抓取在单个操作中的多个记录

1.将所有的记录ID为你想获取到一个数组的记录。
例如,为了获取多个1对一的关系,添加参考字段的所有的目标记录ID为数组。
2.通过传递记录ID的数组作为一个参数创建提取记录操作的对象。

CKFetchRecordsOperation *fetchRecordsOperation = [[CKFetchRecordsOperation alloc] initWithRecordIDs:fetchRecordIDs];
3.可选,提供了每个记录完成处理程序。
如果您想保存成功的个人记录中的数据,提供了每个记录完成处理程序。完成处理程序应为一个成功读取记录中创建一个模型对象,并且因为手术可能失败,应该保持一个失败的记录ID获取。

fetchRecordsOperation.perRecordCompletionBlock = ^(CKRecord *record, CKRecordID *recordID, NSError *error) {
    if (error) {
        // Retain the record IDs for failed fetches
    }
    else {
        // Create a model object and set any relationships to other models
    }
};
4.设置整个操作完成处理程序。

fetchRecordsOperation.fetchRecordsCompletionBlock = ^(NSDictionary *recordsByRecordID, NSError *error) {
    if (error) {
        // Failed to fetch all or some of the records
    }
    else {
        // Update all associated views
    }
};
如果您保存在步骤3中的每个记录完成处理的记录ID,您可以再次尝试获取失败的记录。
5.开始操作。

fetchRecordsOperation.database = [[CKContainer defaultContainer] publicCloudDatabase];
[fetchRecordsOperation start];

指定所有权自动删除相关记录

您可以指定一个参考源记录是否当其目标记录被删除删除。例如,你可能想要一个一对多的关系,孩子当父被删除,被删除。父记录拥有孩子的记录。如果孩子所拥有的其他纪录,他们也将被删除,导致缺失的级联。

../Art/cascade_deletes_2x.png

当您创建引用对象指定的删除操作。要删除当目标被删除源记录,通过目标记录和CKReferenceActionDeleteSelf作为操作参数的initWithRecord:操作:方法。在图库样张,指定当艺术家被删除属于一个艺术家的作品应予以删除。

CKReference *referenceToArtist = [[CKReference alloc] initWithRecord:artistRecord action:CKReferenceActionDeleteSelf];
artworkRecord[@"artist"] = referenceToArtist;
另外,检查CloudKit仪表板的DeleteSelf中为每个记录。
CloudKit删除时的CKReferenceActionDeleteSelf参考第一目标记录被删除源记录。如果一个源记录有多个CKReferenceActionDeleteSelf引用,其可以,即使它的一些其它目标存在记录的删除,导致不一致的数据模型。尝试设计您的模式,使每个记录有不超过一个CKReferenceActionDeleteSelf参考。

../Art/first_delete_wins_2x.png









0 0