【发布时间】:2015-06-17 12:14:42
【问题描述】:
我不确定我对核心数据关系的理解是否存在缺陷,因为我似乎无法实现我想做的事情。
我创建了 2 个实体来管理应用程序上的聊天以及用户和消息之间的一对多关系。所以一个用户可以有很多消息,但这些消息只有你的用户(创建者)。
当添加新消息时,我正在尝试更新ChatUser 实体关系,从而在ChatUser ID 和ChatMessage 之间建立连接。我可以这样做,但是当我向现有的userId 添加新消息时,就会出现问题。目前正在实现的只是在ChatUser 中添加一个额外的userId,而不是仅将关系添加到现有的UserId。
NSManagedObjectContext *context = [self managedObjectContext];
NSError *error = nil;
// 4 . Get Timestamp for Rippll
float timestamp = @([[NSDate date] timeIntervalSince1970]).floatValue;
NSString * jayID = @"eu-west-1:be6457ce-bac1-412d-9307-e375e52e22ff";
NSString *message = @"Science string!";
// Create a new managed object
ChatUser *chatUserManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"ChatUser" inManagedObjectContext:context];
Chat *chatManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"ChatMessage" inManagedObjectContext:context];
Timeline *timelineManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Timeline" inManagedObjectContext:context];
// 3 . Save Timeline
[timelineManagedObject setEvent:chatEvent];
[timelineManagedObject setTimestamp:[NSNumber numberWithFloat:timestamp]];
[timelineManagedObject setMeta:@""];
[timelineManagedObject setViewed:@NO];
[timelineManagedObject setEventID:jayID];
//Save UserMessage
[chatManagedObject setChatId:jayID];
[chatManagedObject setTimestamp:[NSNumber numberWithFloat:timestamp]];
[chatManagedObject setMessage:message];
[chatManagedObject setMedia:@""];
//Check if value exists
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"ChatUser"];
[request setPredicate:[NSPredicate predicateWithFormat:@"userId = %@", jayID]];
[request setFetchLimit:1];
NSArray *entities = [[context executeFetchRequest:request error:&error] mutableCopy];
if (entities.count == 0) {
NSLog(@"GOOD TO ADD");
// no matching object
[chatUserManagedObject setUserId:jayID];
//Create Relationship
[chatUserManagedObject addChatObject:chatManagedObject];
} else {
NSLog(@"IT EXISTS!");
[chatManagedObject setChat:chatUserManagedObject];
}
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
【问题讨论】:
-
如果 'chat' 是您从消息到用户的反向关系,那么您需要做的就是将用户对象分配给聊天消息对象的聊天属性,Core Data 会处理给你。
-
@Paulw11 那么核心数据如何知道它所关联的值呢?
-
@Paulw11 这不是我对
chatUserManagedObject.userId = jayID;所做的吗? -
不,你没有分配对象的“id”,你分配的是实际的 NSManagedObject 实例
-
另一件似乎令人困惑的事情是您的 id 列(来自您的服务器?)不是 Core Data 用来维护关系连接的。它有自己的 id 和外键列,对我们程序员来说是隐藏的。
标签: ios objective-c core-data nsfetchedresultscontroller nsmanagedobject