iOS核心数据关系故障

我有一个核心数据模型,有3个实体。 司机,清单和工作。

每个Manifest都有一个驱动程序,每个驱动程序有多个Manifest,每个Manifest可以有一个或多个Jobs,每个Job有一个Manifest。

当我像这样建立对象时

//Loop through all the Manifests for the driver for (SDZManifest *manifest in allData) { //Create an new instance of manifest in core data Manifest *newManifest = (Manifest*)[[SKCoreDataManager sharedInstance] insertObjectforEntity:kEntity_Manifest]; // *** // Set the data for this manifest // *** [newManifest setDriverID:[NSNumber numberWithInt:[manifest DriverId]]]; [newManifest setManifestID:[manifest ManifestId]]; [newManifest setManifestRef:[manifest ManifestRef]]; [newManifest setSupplierID:[NSNumber numberWithInt:[manifest SupplierId]]]; [newManifest setTruckID:[NSNumber numberWithInt:[manifest TruckId]]]; //Get all the jobs for the manifest NSArray *allJobsForManifest = [manifest Jobs]; NSMutableArray *formattedJobsForManifest = [NSMutableArray array]; //Loop through all the Jobs for this manifiest for (SDZJob *job in allJobsForManifest) { //Set the returned data into a Job object Job *newJob = (Job*)[[SKCoreDataManager sharedInstance] insertObjectforEntity:kEntity_Job]; [newJob setInstructions:[job Instructions]]; [newJob setDateCreated:[job DateCreated]]; [newJob setCreatedBy:[job CreatedBy]]; [newJob setIsLive:[NSNumber numberWithBool:[job IsLive]]]; [newJob setCollectionSequence:[NSNumber numberWithInt:[job CollectionSequence]]]; [newJob setPlannedDeliveryDate:[job PlannedDeliveryDate]]; [newJob setPlannedCollectionDate:[job PlannedCollectionDate]]; [newJob setCustomerRef:[job CustomerRef]]; [newJob setCustomerName:[job CustomerName]]; // *** // Collection address // *** //Break down the address SDZAddress *collectionAddress = [job CollectionAddress]; [newJob setCollectionAddressID:[NSNumber numberWithInt:[collectionAddress Id]]]; [newJob setCollectionAddressLine1:[collectionAddress line1]]; [newJob setCollectionAddressLine2:[collectionAddress line2]]; [newJob setCollectionAddressLine3:[collectionAddress line3]]; [newJob setCollectionAddressCity:[collectionAddress city]]; [newJob setCollectionAddressCounty:[collectionAddress county]]; [newJob setCollectionAddressCountry:[collectionAddress country]]; [newJob setCollectionAddressPostcode:[collectionAddress postcode]]; //Get the lat and lng of the collection address SDZGeoLocation *collectionAddressLatLng = [collectionAddress Geocode]; [newJob setCollectionAddressLat:[collectionAddressLatLng Lat]]; [newJob setCollectionAddressLng:[collectionAddressLatLng Lng]]; // *** // Delivery address // *** //Break down the address SDZAddress *deliveryAddress = [job DeliveryAddress]; [newJob setDeliveryAddressID:[NSNumber numberWithInt:[deliveryAddress Id]]]; [newJob setDeliveryAddressLine1:[deliveryAddress line1]]; [newJob setDeliveryAddressLine2:[deliveryAddress line2]]; [newJob setDeliveryAddressLine3:[deliveryAddress line3]]; [newJob setDeliveryAddressCity:[deliveryAddress city]]; [newJob setDeliveryAddressCounty:[deliveryAddress county]]; [newJob setDeliveryAddressCountry:[deliveryAddress country]]; [newJob setDeliveryAddressPostcode:[deliveryAddress postcode]]; //Get the lat and lng of the collection address SDZGeoLocation *deliveryAddressLatLng = [deliveryAddress Geocode]; [newJob setDeliveryAddressLat:[deliveryAddressLatLng Lat]]; [newJob setDeliveryAddressLng:[deliveryAddressLatLng Lng]]; [formattedJobsForManifest addObject:newJob]; NSLog(@"\n\n-- NEW JOB --\n%@\n\n", newJob); } //Show all Jobs for this manifest NSLog(@"\n\n-- JOBS FOR MANIFEST --\n%@\n\n", formattedJobsForManifest); } 

然后我将Manifest对象保存到核心数据中。

当他们点击表格视图单元格时,我从一系列清单中获取对象并将其传递给另一个视图。 当我记录传递的清单时,它会记录:

 -- PASSED MANIFEST --  (entity: Manifest; id: 0xe59c3e0  ; data: { driver = nil; driverID = 1; jobs = ""; manifestID = "f705c777-9455-4792-bd84-2deada410dab"; manifestRef = 001; supplierID = 2; truckID = 8; }) 

当我记录NSLog(@"\n\n-- PASSED MANIFEST JOBS --\n%@\n\n", [passedManifest jobs]); 结果是

 -- PASSED MANIFEST JOBS -- Relationship 'jobs' fault on managed object (0xe59d540)  (entity: Manifest; id: 0xe59c3e0  ; data: { driver = nil; driverID = 1; jobs = ""; manifestID = "f705c777-9455-4792-bd84-2deada410dab"; manifestRef = 001; supplierID = 2; truckID = 8; }) 

为什么在托管对象(0xe59d540)上关系’作业’错误

当我NSLog(@"\n\n-- JOB COUNT --\n%u\n\n", [[passedManifest jobs] count]); 它返回0

核心数据故障只是意味着尚未从“磁盘”加载数据。

它会在需要时自动为您加载,因此无需担心。

我刚才有同样的问题。 我想我仍然不完全确定为什么,但似乎关系实际上并没有超出你的期望。 但是,要预取它们实际上非常简单。 只需将以下内容添加到核心数据请求中即可…

 [request setRelationshipKeyPathsForPrefetching:@[ @"relationship_name" ]]; 

您可以通过这种方式预加载多个关系,从而预加载数组。