ios - 向现有核心数据实体关系添加新属性

标签 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]);
}

最佳答案

一旦您从任一方向启动关系,Core Data 将自动管理关系的另一端。您可以添加到 ChatUserchat 集合或使用 ChatMessagechat 实例设置 NSManagedObject,这就是您所要做的。请注意,此过程不需要您管理外键,复杂性已从您那里抽象出来。如果服务器端 ID 可以帮助您与 API 交互,您仍然可以存储它们,但 Core Data 不需要它们。

我建议更改关系的一端,这样两者就不会被命名为同一事物。考虑将 ChatUser 的关系更新为 messages 或类似的东西。

关于ios - 向现有核心数据实体关系添加新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29584093/

相关文章:

iOS CollectionView : Display View, 然后下载图片,然后显示图片

objective-c - 具有内存存储的核心数据

ios - 如何通过索引属性从核心数据中获取对象?

ios - 如何检查框架是否包含完整的位码?

ios - 无法将 IBAction 连接到 XIB 中的 UITextField (Swift)

objective-c - 在 NSMutableArray 和 Sqlite 中存储 CGPoints

ios - Swift 改变 Coredata 的值,而不是创建新的

ios - UIImagePickerController 在 Swift 3 的图像编辑模式下更改底部栏按钮标题

ios - 显示不同高度的 UIWebView 和 UITableView

iPhone计算器输入时小数位反转