我不确定我对核心数据关系的理解是否有缺陷,因为我似乎无法实现我想要做的事情。
我创建了2个实体来管理应用程序上的聊天,以及用户和消息之间的一对多关系。因此,用户可以拥有许多消息,但消息只有您的用户(创建者)。
我想在添加新邮件时更新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]);
}
答案 0 :(得分:6)
一旦从任一方向启动,核心数据将自动管理关系的另一端。您可以添加到ChatUser
的{{1}}集合,也可以将chat
的{{1}}设置为ChatMessage
的实例,这就是您需要做的全部工作。请注意,此过程不需要您管理外键,从而提取复杂性。如果它们可以帮助您与API进行交互,您仍然可以存储服务器端ID,但Core Data不需要它们。
我建议改变关系的一端,这样两者都不会被命名为同一个东西。考虑将chat
的关系更新为NSManagedObject
或类似内容。
答案 1 :(得分:1)
如果您有任何问题,请随时提出任何跟进问题。干杯!
答案 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]);
}