保存后CoreData objectID始终相同

Posted

技术标签:

【中文标题】保存后CoreData objectID始终相同【英文标题】:CoreData objectID is always the same after save 【发布时间】:2015-07-04 20:14:40 【问题描述】:

这是我的问题。我创建了一个 coreData NSManagedObject,保存它,它总是创建一个具有相同 objectID 的新对象......这对我没有任何意义,因为我认为 objectID 是唯一的。我一定是在房间里错过了像大象一样大的东西,但我看不到它......

这是我的部分代码:

- (Conversation *) saveImagesToCore:(NSData *)userImage andOtherImage:(NSData *)otherImage 

NSManagedObjectContext *moc = [(AppDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext];

Message *topMessage = [self saveImageToCore:otherImage
                                 andCloudID:self.otherCloudIDsmall
                                    andUser:_friendShaker];
Message *bottomMessage = [self saveImageToCore:userImage
                                    andCloudID:_userCloudID
                                       andUser:_currentUser];

NSSet *messages = [NSSet setWithArray:@[topMessage, bottomMessage]];


NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Conversation"
                                                     inManagedObjectContext:moc];

Conversation *newConversation = (Conversation *)[[NSManagedObject alloc] initWithEntity:entityDescription
                                                         insertIntoManagedObjectContext:moc];

newConversation.dateStarted = [NSDate date];
newConversation.isHost = [NSNumber numberWithBool:_currentUserIsCalling];
newConversation.user = (User *) _friendShaker.userCoreData;
[newConversation addMessage:messages];

NSError *error = nil;

if (![newConversation.managedObjectContext save:&error]) 
    NSLog(@"Unable to save managed object context.");
    NSLog(@"%@, %@", error, error.localizedDescription);
 else 
    NSLog(@"Conversation saved *******");
    NSLog(@"Conversation ID %@",[newConversation objectID]);

    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:newConversation forKey:@"conversation"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ConversationSaved" object:self userInfo:userInfo];


return (Conversation *) newConversation;

感谢您的帮助。我要疯了。

这是 newConversation 对象的打印输出:

<Conversation: 0x16758cd0> (entity: Conversation; id: 0x165073b0 <x-coredata://E31BE071-9ED6-4624-8440-2DC619535A00/Conversation/p7> ; data: 
allowShareOther = 0;
allowShareSelf = 0;
dateLastModified = nil;
dateStarted = "2015-07-05 15:03:24 +0000";
isHost = 1;
message =     (
    "0x165b1780 <x-coredata://E31BE071-9ED6-4624-8440-2DC619535A00/Message/p14>",
    "0x165caa00 <x-coredata://E31BE071-9ED6-4624-8440-2DC619535A00/Message/p13>"
);
preview = nil;
type = nil;
user = "0x16687110 <x-coredata://E31BE071-9ED6-4624-8440-2DC619535A00/User/p3>";)

您会注意到我的问题:newConversation ObjectID 实际上是用户 ObjectID。所以每次我创建一个对话时,它都有用户的 ObjectID。

【问题讨论】:

对不起,如果我很迟钝,但我看不出问题所在。 newConversation 打印输出中的内容显示其objectID 实际上是用户objectID 没错!我读错了 ObjectID。 【参考方案1】:

尝试“刷新”objectID:

NSPersistentStoreCoordinator *coordinator =  [(AppDelegate*)[[UIApplication sharedApplication] delegate] persistentStoreCoordinator];
NSURL *uriRep = [newConversation.objectID URIRepresentation];
NSManagedObjectID *realID = [coordinator managedObjectIDForURIRepresentation:uriRep];

NSLog(@"Conversation ID %@",realID);

【讨论】:

同样的结果。我知道只要不保存 NSManaged 对象,它就有一个临时的 ObjectID。但它应该每次都使用相同的 ObjectID 创建一个新实体。

以上是关于保存后CoreData objectID始终相同的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 中获取多个 objectID?

RestKit CoreData 0.20.3 - 映射完成后保存 MOC 之前的额外检查

解析服务器在 mongodb 中创建相同的 objectid

Mongoose + MongoDB - 尝试使用 POSTMAN 保存后,转换为 ObjectID 的值失败

.fullScreenCover 始终打开相同的详细信息页面

CoreData 的自定义 UID 数据类型