问题
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:
- First time adding (in one class) objects to
CoreDataAllTraps
going well since I log the objects and see the details are correct. - 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