iOS核心数据更新到未保存的数据
我正在使用名为iOS核心数据更新到未保存的数据,ios,objective-c,core-data,Ios,Objective C,Core Data,我正在使用名为CrumbPoint的核心数据实体,它存储纬度和经度,并指向(与)另一个名为HRRecord的实体。碎屑点的创建方式如下: CrumbPoint *crumbPoint = [NSEntityDescription insertNewObjectForEntityForName:@"CrumbPoint" inManagedObjectContext:context]; c
CrumbPoint
的核心数据实体,它存储纬度和经度,并指向(与)另一个名为HRRecord
的实体。碎屑点的创建方式如下:
CrumbPoint *crumbPoint = [NSEntityDescription insertNewObjectForEntityForName:@"CrumbPoint"
inManagedObjectContext:context];
crumbPoint.lat = [NSNumber numberWithFloat:lat];
crumbPoint.lon = [NSNumber numberWithFloat:lon];
crumbPoint.velocity = [NSNumber numberWithFloat:velocity];
crumbPoint.date = [NSDate date];
// Since this use search query, always refresh from DB
// The following fetch using NSFetchRequest when the record is available.
HrRecord * hr = [HRRecord hrRecordWithTitle:title inManagedObjectContext:context];
crumbPoint.inRecord = hr;
hr记录有一个名为距离的字段,每当设备有位置更新时,我都需要更新该字段。(我正在跟踪用户慢跑)。对于每个位置更新,都会创建一个新的CrumbPoint
,并指向同一慢跑会话的相同HrRecord
。需要计算上一个位置和新位置之间的新距离,并且需要更新hr记录的距离
然而,我的问题是,每次我获取HrRecord时(可能这是一个糟糕的设计,但我每次都使用NSFetchRequest
查询HrRecord
以更新新位置。)
现在,当我尝试更新时:
HrRecord * hr = crumbPoint.inRecord;
float oldDistance = [hr.distance doubleValue];
// code to calculate distance here, then, update
hr.distance = [NSNumber numberWithDouble: newDistanceUpdate];
hr.distance
在更新前始终为0,即使每次更新后我都可以打印出新值。我尝试将save
发送到托管对象上下文,但似乎也不起作用。为什么呢
编辑:
下面是要插入的代码。可能错误不是关于保存,在保存上下文后,我尝试使用[HrRecord HrRecordWithTitle:title inManagedObjectContext:context]
拉出记录,并更新了该回合的距离。但下一次位置更新时,出于某种原因,它又是0。我要查更多的密码/
+(HrRecord *)HrRecordWithTitle: (NSString *)title
inManagedObjectContext:(NSManagedObjectContext *)context
{
HrRecord * record = nil;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"HrRecord"];
request.predicate = [NSPredicate predicateWithFormat:@"title = %@", title];
NSSortDescriptor * sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError * error = nil;
NSArray * records = [context executeFetchRequest:request error:&error];
if (!records || records.count > 1) {
// Nil, or more than one is an error
} else if (records.count == 0) {
// Create a new record with starting duration of 0
record = [NSEntityDescription insertNewObjectForEntityForName:@"HrRecord" inManagedObjectContext:context];
record.title = title;
record.duration = @0.0;
record.distance = @0.0;
record.date = [NSDate date];
} else { // Recrod exists, exactly one
record = [records lastObject];
// update duration
record.duration = @([record.duration intValue] + 1);
}
return record;
}
您使用什么托管对象上下文?您应该使用在当前线程中创建的上下文。您能否发布一些代码,说明如何在正确的NSManagedObjectContext
中实际插入该上下文?我假设您的数据模型设置正确,并且HrRecord
类也会立即从该模型生成,对吗?我注意到在类方法调用中有一个输入错误:“HRRecord”而不是“HRRecord”。我不知道您的实现,但尝试在获取数据之前对获取数据的上下文执行save
,这将refresh
上下文。很愚蠢,每当我创建一个新点时,我都会重置记录距离。我的错。