将新属性添加到现有核心数据实体关系

时间:2015-04-11 23:07:51

标签: ios objective-c core-data nsfetchedresultscontroller nsmanagedobject

我不确定我对核心数据关系的理解是否有缺陷,因为我似乎无法实现我想要做的事情。

我创建了2个实体来管理应用程序上的聊天,以及用户和消息之间的一对多关系。因此,用户可以拥有许多消息,但消息只有您的用户(创建者)。

enter image description here

我想在添加新邮件时更新ChatUser实体关系,从而建立ChatUser ID与ChatMessage之间的连接。我可以这样做,但当我向现有userId添加新消息时出现问题。目前正在实现的所有目标是在userId中添加额外的ChatUser,而不是仅添加与现有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]);
}

3 个答案:

答案 0 :(得分:6)

一旦从任一方向启动,核心数据将自动管理关系的另一端。您可以添加到ChatUser的{​​{1}}集合,也可以将chat的{​​{1}}设置为ChatMessage的实例,这就是您需要做的全部工作。请注意,此过程不需要您管理外键,从而提取复杂性。如果它们可以帮助您与API进行交互,您仍然可以存储服务器端ID,但Core Data不需要它们。

我建议改变关系的一端,这样两者都不会被命名为同一个东西。考虑将chat的关系更新为NSManagedObject或类似内容。

答案 1 :(得分:1)

  1. 您应首先检查您的Context中是否已存在ChatUser实体。只需尝试使用该userId获取ChatUser,如果有ChatUser返回表示ChatUser已经被创建;如果它返回nil则意味着没有正在创建userId的ChatUser实体。
  2. 要处理1 - 多关系,您应该使用[message setChatUser:chatUser]而不是chatUser addMessageObject
  3. 如果您有任何问题,请随时提出任何跟进问题。干杯!

答案 2 :(得分:1)

尝试实现类似这样的东西。该解决方案与Amin Negm-Awad提出的解决方案几乎相同

NSManagedObjectContext *context = [self managedObjectContext];
NSError *error = nil;

// 4 . Get Timestamp for Rippll

NSString * jayID = @"eu-west-1:be6457ce-bac1-412d-9307-e375e52e22ff";

NSString *message = @"Science string!";

//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];

ChatUser *chatUserManagedObject = nil;

if (entities.count)
{
    NSLog(@"IT EXISTS!");
    chatUserManagedObject = entities.firstObject;
}
else
{
    NSLog(@"GOOD TO ADD");
    chatUserManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"ChatUser" inManagedObjectContext:context];
    [chatUserManagedObject setUserId:jayID];
}

// Create a new managed object

Chat *chatManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"ChatMessage" inManagedObjectContext:context];

//Save UserMessage
[chatManagedObject setChatId:jayID];
[chatManagedObject setTimestamp:[NSDate date]];
[chatManagedObject setMessage:message];
[chatManagedObject setMedia:@""];

[chatUserManagedObject addChatObject:chatManagedObject];

// Save the object to persistent store
if (![context save:&error]) {
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
相关问题