Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS Core data relationship faults

I have a core data model that has 3 entities. Driver, Manifest and Jobs.

Each Manifest has one driver, each Driver has multiple Manifests, each Manifest can have one or more Jobs and each Job refers to one Manifest.

When I build up the objects like so

//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);

}

I then save that Manifest object to core data.

When they click on the table view cell I get the object from an array of manifests and pass it to another view. When I log the passed manifest it loggs :

-- 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;
})

When I log NSLog(@"\n\n-- PASSED MANIFEST JOBS --\n%@\n\n", [passedManifest jobs]); the result is

-- 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;
})

Why is it saying Relationship 'jobs' fault on managed object (0xe59d540)?

When I NSLog(@"\n\n-- JOB COUNT --\n%u\n\n", [[passedManifest jobs] count]); it returns 0

like image 643
Ste Prescott Avatar asked Jan 30 '26 08:01

Ste Prescott


1 Answers

I've just had the exact same issue. I guess I'm still not entirely sure why, but it seems that relationships are not actually fetched until later than you're expecting. To prefetch them is actually pretty simple, though. Just add the following to your core data request...

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

You can preload multiple relationships this way, thus the array.

like image 180
shortstuffsushi Avatar answered Feb 01 '26 23:02

shortstuffsushi