我的核心数据中有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引用一个,但没有一个工作。
修改
CoreDataAllTraps
,因为我记录对象并查看详细信息是否正确。fetchedObjects.count = 0
(在其他课程中)。修改-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而不需要在不同函数的末尾调用函数。