2

我有一个包含 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 --
<Manifest: 0xe59d540> (entity: Manifest; id: 0xe59c3e0 <x-coredata://9F572794-745F-4E43-B4D0-9EC3506EA6E4/Manifest/p5> ; data: {
    driver = nil;
    driverID = 1;
    jobs = "<relationship fault: 0x7b3d290 '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) <Manifest: 0xe59d540> (entity: Manifest; id: 0xe59c3e0 <x-coredata://9F572794-745F-4E43-B4D0-9EC3506EA6E4/Manifest/p5> ; data: {
    driver = nil;
    driverID = 1;
    jobs = "<relationship fault: 0x7b3d290 '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

4

2 回答 2

12

我刚刚遇到了完全相同的问题。我想我仍然不完全确定为什么,但似乎直到比您预期的更晚才真正获取关系。不过,预取它们实际上非常简单。只需将以下内容添加到您的核心数据请求中...

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

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

于 2012-10-17T04:35:04.130 回答
6

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

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

于 2012-10-07T15:00:06.787 回答