保存后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始终相同的主要内容,如果未能解决你的问题,请参考以下文章
RestKit CoreData 0.20.3 - 映射完成后保存 MOC 之前的额外检查
解析服务器在 mongodb 中创建相同的 objectid
Mongoose + MongoDB - 尝试使用 POSTMAN 保存后,转换为 ObjectID 的值失败