fetchedObjects(NSArray)计数在它满了对象时返回0

时间:2014-02-16 09:45:57

标签: ios objective-c core-data

我的核心数据中有2个托管对象:CoreDataTrap& CoreDataAllTraps。 到目前为止,有关CoreDataTrap的更新,添加,删除,保存等方面的一切进展顺利。 但是,当我尝试使用第二个托管对象CoreDataAllTraps时,我没有错误的描述,只是一个简单的nil数组获取对象。

弄乱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);
  

记录下来:fetchedObjects.count:0

我记录了一个没有任何细节的错误,fetchedObjects.count=0。 我尝试创建一个新的NSManagedObjectContext并从AppDelegate引用一个,但没有一个工作。

修改

  1. 首次将(在一个类中)对象添加到CoreDataAllTraps,因为我记录对象并查看详细信息是否正确。
  2. 我的情况是fetchedObjects.count = 0(在其他课程中)。
  3. 修改-2:

    从不同的课程中保存(效果很好):

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

    然后从不同的班级阅读,以确保一切正常(效果很好):

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

    记录下来:

    fetchedObjects.count: 222
    

    UPDATE-1:

    我尝试了其他的东西:当我将对象保存到核心数据时,我从原始保存功能的末尾调用该函数。这种方式看起来很糟糕,但它确实有效。我仍然在寻找一种美妙的方式来混淆MOC而不需要在不同函数的末尾调用函数。

0 个答案:

没有答案