fetchedObjects(NSArray)计数返回0,当它充满对象

我在我的核心数据中有2个托pipe对象: CoreDataTrapCoreDataAllTraps 。 到目前为止,CoreDataTrap的更新,添加,删除,保存等操作都进行得很顺利。 但是,当我尝试使用第二个托pipe对象CoreDataAllTraps我没有错误的描述,只是一个简单的CoreDataAllTraps组的获取对象。

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

logging此:fetchedObjects.count:0

我logging了一个没有任何细节的错误, fetchedObjects.count=0 。 我试图创build一个新的NSManagedObjectContext和引用从AppDelegate之一,他们都没有工作。

编辑:

  1. 第一次添加(在一个类)对象到CoreDataAllTraps进展顺利,因为我login的对象,看到的细节是正确的。
  2. 我的情况是fetchedObjects.count = 0 (在其他类)。

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

logging这个:

 fetchedObjects.count: 222 

更新1:

我尝试了其他的东西:当我将对象保存到核心数据时,我从原来的保存函数结束调用函数。 这种方式看起来不好,但它的工作原理。 我仍然在寻找一种美妙的方式来混淆MOC,而不用从不同的函数结尾调用函数。