简体   繁体   English

iOS核心数据关系故障

[英]iOS Core data relationship faults

I have a core data model that has 3 entities. 我有一个核心数据模型,有3个实体。 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. 每个Manifest都有一个驱动程序,每个驱动程序有多个Manifest,每个Manifest可以有一个或多个Jobs,每个Job有一个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. 然后我将Manifest对象保存到核心数据。

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]); 当我记录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) ? 为什么在托管对象(0xe59d540)上关系'作业'错误

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

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. 您可以通过这种方式预加载多个关系,从而预加载数组。

A core data fault simply means that the data has not been loaded from the "disk" yet. 核心数据故障只是意味着尚未从“磁盘”加载数据。

It will be automatically loaded for you however, when needed, so there is nothing to be concerned about. 但是,如果需要,它会自动为您加载,因此没有什么可担心的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM