fetchedObjects (NSArray) count return 0 when it's full of objects

£可爱£侵袭症+ 提交于 2020-01-06 12:44:08

问题


I've 2 managed objects in my core data: CoreDataTrap & CoreDataAllTraps. So far, everything regarding updating, adding, deleting, saving etc with CoreDataTrap going well. But when I try to work with the 2nd managed object CoreDataAllTraps I've no error's description, just a simple nil array of fetched objects.

Example for messing with CoreDataAllTraps:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:kCORE_DATA_ALL_TRAPS_ENTITY inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSError *error = nil;
    NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (fetchedObjects == nil || fetchedObjects.count == 0) {
        NSLog(@"localizedDescription: %@, userInfo: %@", error.localizedDescription, error.userInfo);
        success = NO;
    }


    NSLog(@"%s success/fail: %@", __PRETTY_FUNCTION__, success?@"yes":@"no");
    NSLog(@"fetchedObjects.count: %d", fetchedObjects.count);

Log this: fetchedObjects.count: 0

I log an error with no details at all, fetchedObjects.count=0. I tried to create a new NSManagedObjectContext and referencing one from AppDelegate, none of them work.

EDIT:

  1. First time adding (in one class) objects to CoreDataAllTraps going well since I log the objects and see the details are correct.
  2. My case is fetchedObjects.count = 0 (in other class).

EDIT-2:

Saving from different class (works great):

- (void)addOrUpdateTrap:(Traps*)trapObject
{
    int trapID = trapObject.getTrapID;
    CoreDataAllTraps *trapEntity = nil;
    NSError *error = nil;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:kCORE_DATA_ALL_TRAPS_ENTITY];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"trapID == %d", trapID];
    [fetchRequest setPredicate:predicate];

    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (results == nil)
    {
        // Handle error
    }
    else if ([results count] == 0)
    {
        // Nothing to update, add new trap
        // Create a new record (row)
        trapEntity = [NSEntityDescription insertNewObjectForEntityForName:kCORE_DATA_ALL_TRAPS_ENTITY inManagedObjectContext:self.managedObjectContext];
    }
    else
    {
        trapEntity = results[0]; // There should be only one object for the ID.
    }


    if (trapEntity != nil)
    {
        // Set properties for new or existing object ...

        // Int
        [trapEntity setTrapID:[NSNumber numberWithInt:trapObject.getTrapID]];
        [trapEntity setType:[NSNumber numberWithInt:trapObject.getTrapType]];
        [trapEntity setDist:[NSNumber numberWithInt:trapObject.getTrapDistanceToCar]];
        [trapEntity setDist_to_close_point:[NSNumber numberWithInt:trapObject.getTrapDistanceToClosePoint]];
        [trapEntity setActive:[NSNumber numberWithInt:trapObject.isActive]];
        [trapEntity setAlert:[NSNumber numberWithInt:trapObject.isAlert]];
        [trapEntity setAlarmDistance:[NSNumber numberWithInt:trapObject.alarmDistance]];
        [trapEntity setRoadNumber:[NSNumber numberWithInt:trapObject.roadNumber]];
        [trapEntity setPolys:[NSNumber numberWithInt:trapObject.polygons]];
        [trapEntity setEnter_to_area:[NSNumber numberWithInt:trapObject.getTrapEnterToArea]];

        // Double
        [trapEntity setLat:[NSNumber numberWithDouble:trapObject.getTrapLat]];
        [trapEntity setLon:[NSNumber numberWithDouble:trapObject.getTrapLon]];
        [trapEntity setClose_point_lat:[NSNumber numberWithDouble:trapObject.getTrapClosePointLat]];
        [trapEntity setClose_point_lon:[NSNumber numberWithDouble:trapObject.getTrapClosePointLon]];

        // NSString
        [trapEntity setLastTrapAlarm:[NSString stringWithFormat:@"%li", trapObject.getTrapLastAlarm]];
        [trapEntity setPoly0:trapObject.getTrapPolygonA];
        [trapEntity setPoly1: trapObject.getTrapPolygonB];
        [trapEntity setPoly2: trapObject.getTrapPolygonC];
        [trapEntity setPolygonAzimut1: trapObject.getTrapPolygonAzimuthA];
        [trapEntity setPolygonAzimut2: trapObject.getTrapPolygonAzimuthB];
        [trapEntity setPolygonAzimut3: trapObject.getTrapPolygonAzimuthC];
        [trapEntity setDesc: trapObject.getTrapDesc];
        // etc. for all properties ...

        error = nil;
        if ([self.managedObjectContext save:&error] == NO)
        {
            NSLog(@"%s error saving: %@\n%@", __PRETTY_FUNCTION__, error.localizedDescription, error.userInfo);
        }
    }
}

Then reading from different class just to ensure all is ok (works great):

- (void)saveArray
{
    // [Netroads sharedInstance].arrayOfAllTraps = [dbat getAllTraps];
    [Netroads sharedInstance].arrayOfAllTraps = self.allTraps;
    NSLog(@"[Netroads sharedInstance].arrayOfAllTraps.count: %i", [Netroads sharedInstance].arrayOfAllTraps.count);

    self.managedObjectContext = appDelegate.managedObjectContext;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:kCORE_DATA_ALL_TRAPS_ENTITY inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    NSError *error = nil;
    NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    NSLog(@"fetchedObjects.count: %d", fetchedObjects.count);

Log this:

fetchedObjects.count: 222

UPDATE-1:

I tried something else: when i'm saving the objects to core data, i'm calling the function from the end of the original saving function. This way is looks bad but it works. I still look for a beautiful way to mess with the MOC without calling function from the end of different function.

来源:https://stackoverflow.com/questions/21809624/fetchedobjects-nsarray-count-return-0-when-its-full-of-objects

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!