将更多对象提取到实体后,核心数据关系丢失
我有一个核心数据模型,看起来像这样。
在tableview中我加载了所有约会。 在我的custom cell
内的UILabel
,我按如下方式设置约会位置名称。
NSString *info = appointment.location.label_vrij;
起初一切都运行Oké,但是当我将更多约会加载到我的database
。 所有信息字符串都为NULL
。 经过一些调试后,我注意到appointment.location
也返回NULL
。
这就是我的NSFetchRequest的样子
RKManagedObjectStore *store = [[SanMaxDataModel sharedDataModel] objectStore]; NSManagedObjectContext *context = store.mainQueueManagedObjectContext; NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Appointment"]; NSString *relationshipKeyPath = @"location"; // Set this to the name of the relationship on "A" that points to the "B" objects; NSArray *keyPaths = [NSArray arrayWithObject:relationshipKeyPath]; [fetchRequest setRelationshipKeyPathsForPrefetching:keyPaths]; NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateStart" ascending:YES]; fetchRequest.sortDescriptors = @[descriptor]; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"tijd_dag = %@",strDate]; [fetchRequest setPredicate:predicate]; NSArray *matches = [context executeFetchRequest:fetchRequest error:nil]; appointments = [matches mutableCopy];
所以我认为我的关系搞砸了?
编辑
我正在使用Restkit将我的约会映射到我的核心数据库。 从下面的评论中,我决定关闭Appointment实体中location属性的选项标志。 因为约会应该总是有一个位置。
现在当我装载第一天。 一切正常。 但是当我第二天尝试加载时,我收到错误: The operation couldn\U2019t be completed. (Cocoa error 1570.)
The operation couldn\U2019t be completed. (Cocoa error 1570.)
现在我看一下详细的错误
DetailedError: { NSLocalizedDescription = "The operation couldn\U2019t be completed. (Cocoa error 1570.)"; NSValidationErrorKey = location; NSValidationErrorObject = " (entity: Appointment; id: 0x9272c70 ; data: {\n autouur = 1;\n breekuur = 0;\n data1 = \"\";\n data2 = \"\";\n data3 = \"\";\n data4 = \"\";\n data5 = \"\";\n data6 = \"\";\n data7 = \"\";\n data8 = \"\";\n data9 = \"\";\n dateStart = \"2013-10-23 09:00:00 +0000\";\n dateStop = \"2013-10-23 09:30:00 +0000\";\n duration = 30;\n email = \"\";\n entryID = 774294984959;\n info = \"\";\n \"is_blocked\" = 0;\n \"is_except\" = 0;\n \"is_free\" = 1;\n \"is_moved\" = 0;\n \"is_vert\" = 0;\n locatieID = 773150;\n location = nil;\n multiID = nil;\n serverEntryID = 774294984959;\n serverLocatieID = 773150;\n sms = \"\";\n \"tijd_dag\" = 20131023;\n \"tijd_uur\" = 900;\n})"; }
这就是我在核心数据中加载JSON的方法
-(void)getAppointmentsForDate:(NSString *)date forUserID:(NSString *)userID{ API *api = [API new]; RKManagedObjectStore *store = [[SanMaxDataModel sharedDataModel] objectStore]; NSLog(@"store is %@",store); NSManagedObjectContext *context = store.mainQueueManagedObjectContext; RKObjectManager *objectManager = [api mapAppointments]; NSString *urlString = [NSString stringWithFormat:@"/doctor/1.0/json/nl/appointments/get-by-date/apikey/%@?uid=%@&date=%@",APIKey,userID,date]; // NSString *urlString = [NSString stringWithFormat:@"/doctor/1.0/json/nl/appointments/get-by-date/apikey/%@?uid=77382&date=%@",APIKey,date]; NSURLRequest *request = [objectManager requestWithObject:nil method:RKRequestMethodGET path:urlString parameters:nil]; RKManagedObjectRequestOperation *operation = [objectManager managedObjectRequestOperationWithRequest:request managedObjectContext:context success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { NSLog(@"TILL HERE IN METHOD"); NSError *error = nil; [[NSNotificationCenter defaultCenter] postNotificationName:@"appointmentsLoaded" object:self]; [[SanMaxDataModel sharedDataModel] saveToPersistentStoreAsync:&error]; } failure:^(RKObjectRequestOperation *operation, NSError *error) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; NSLog(@"Hit error: %@", error); }]; [objectManager enqueueObjectRequestOperation:operation]; }
看起来您的问题是默认情况下,RestKit会在执行新映射时替换关系的内容。 你需要告诉它你想要新的关系数据。 通过设置:
relationshipMapping.assignmentPolicy = RKAssignmentPolicyUnion;
如果您使用的是旧版本的RestKit,则需要使用RKUnionAssignmentPolicy
。
relationshipMapping
是您的RKRelationshipMapping
实例。