我正在使用coredata并且有一个概念,我没有得到;我有2个托管对象ACConversation和ACMessages具有一对多关系,因此我保存与对话关联的消息并尝试根据以下内容将其取回:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.conversation = %@", self.conversation];
但是与该对象关联的id是不同的(它似乎更像是一个内存地址)并且使用上面的谓词它不会获取任何内容:
2013-01-01 18:32:13.727 CoreDataTest[9325:c07] The message to fetch: <NSManagedObject: 0x818f680> (entity: ACMessage; id: 0x8160630 <x-coredata:///ACMessage/t451CC5A3-5972-479C-BC7C-6B91CA4DA23C4> ; data: {
conversation = "0x818b770 <x-coredata:///ACConversation/t451CC5A3-5972-479C-BC7C-6B91CA4DA23C2>";
sentDate = "2013-01-01 23:32:13 +0000";
text = "Test message to Fetch through relationship!!!";
})
2013-01-01 18:32:13.728 CoreDataTest[9325:c07] The conversation associated to the message: <NSManagedObject: 0x818b710> (entity: ACConversation; id: 0x818b770 <x-coredata:///ACConversation/t451CC5A3-5972-479C-BC7C-6B91CA4DA23C2> ; data: {
draft = nil;
lastMessageSentDate = "2013-01-01 23:32:13 +0000";
lastMessageText = "Test message to Fetch through relationship!!!";
messages = (
"0x8160630 <x-coredata:///ACMessage/t451CC5A3-5972-479C-BC7C-6B91CA4DA23C4>"
);
messagesLength = 0;
unreadMessagesCount = 0;
users = (
"0x818b610 <x-coredata:///ACUser/t451CC5A3-5972-479C-BC7C-6B91CA4DA23C3>"
);
})
2013-01-01 18:32:13.782 CoreDataTest[9325:c07] The conversation found is: <NSManagedObject: 0x835e440> (entity: ACConversation; id: 0x8199860 <x-coredata://6E4B40F2-F7B4-4275-BF6E-349101A1254F/ACConversation/p290> ; data: <fault>)
2013-01-01 18:32:13.783 CoreDataTest[9325:c07] The conversation to find is: <NSManagedObject: 0x818b710> (entity: ACConversation; id: 0x835e2e0 <x-coredata://6E4B40F2-F7B4-4275-BF6E-349101A1254F/ACConversation/p296> ; data: {
draft = nil;
lastMessageSentDate = "2013-01-01 23:32:13 +0000";
lastMessageText = "Test message to Fetch through relationship!!!";
messages = (
"0x835e6d0 <x-coredata://6E4B40F2-F7B4-4275-BF6E-349101A1254F/ACMessage/p268>"
);
messagesLength = 0;
unreadMessagesCount = 0;
users = (
"0x835ea20 <x-coredata://6E4B40F2-F7B4-4275-BF6E-349101A1254F/ACUser/p296>"
);
})
代码下面的:
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController) {
NSLog(@"_fetchedResultsController found: %@", _fetchedResultsController);
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"ACMessage"];
NSError __autoreleasing *error = nil;
NSUInteger messagesCount = [managedObjectContext countForFetchRequest:fetchRequest error:&error];
NSAssert(messagesCount != NSNotFound, @"-[NSManagedObjectContext countForFetchRequest:error:] error:\n\n%@", error);
if (messagesCount > MESSAGE_COUNT_LIMIT) {
[fetchRequest setFetchOffset:messagesCount-MESSAGE_COUNT_LIMIT];
}
[fetchRequest setFetchBatchSize:10];
[fetchRequest setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"sentDate" ascending:YES]]];
/*
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.conversation = %@", self.conversation];
[fetchRequest setPredicate:predicate];
//NSLog(@"Predicate: %@", predicate);
*/
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"ACMessage"];
_fetchedResultsController.delegate = self;
NSAssert([_fetchedResultsController performFetch:&error], @"-[NSFetchedResultsController performFetch:] error:\n\n%@", error);
return _fetchedResultsController;
}
- (void) setSimpleData
{
self.conversation = [NSEntityDescription insertNewObjectForEntityForName:@"ACConversation" inManagedObjectContext:managedObjectContext];
self.conversation.lastMessageSentDate = [NSDate date];
ACUser *user = [NSEntityDescription insertNewObjectForEntityForName:@"ACUser" inManagedObjectContext:managedObjectContext];
[user setName: @"my user"];
[user setElementId: @"kjh123k123"];
[self.conversation addUsersObject:user];
ACMessage *message = [NSEntityDescription insertNewObjectForEntityForName:@"ACMessage" inManagedObjectContext:managedObjectContext];
self.conversation.lastMessageSentDate = message.sentDate = [NSDate date];
self.conversation.lastMessageText = message.text = @"Test message to Fetch through relationship!!!";
[self.conversation addMessagesObject:message];
NSLog(@"The message to fetch: %@", message);
//NSLog(@"The user associated to the conversation: %@", user);
NSLog(@"The conversation associated to the message: %@", self.conversation);
NSError *error;
if (![[self managedObjectContext] save:&error]) {
//Make sure you handle this!
NSLog(@"ERROR: Can't save object context");
exit(-1);
}
}
- (void) getSimpleData
{
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
NSInteger section = 0;
id sectionInfo = [[[self fetchedResultsController] sections] objectAtIndex:section];
if ([sectionInfo numberOfObjects]>0) {
NSIndexPath *my0 = [NSIndexPath indexPathForRow:0 inSection:0];
ACMessage *message = [self.fetchedResultsController objectAtIndexPath:my0];
ACConversation *conv = message.conversation;
NSLog(@"The message fetch at index 0 is %@", message);
NSLog(@"The conversation found is: %@", conv);
NSLog(@"The conversation to find is: %@", self.conversation);
} else {
NSLog(@"No messages found!");
}
}
我错过了什么或者我必须在ACConversation中设置一个id并在NSPredicate中使用它来查找与该会话相关的所有消息吗?
谢谢! 亚历
答案 0 :(得分:4)
首次创建托管对象时,它具有临时objectID
。保存更改后,这会更改为永久objectID
。这是它唯一一次改变 - 从原始临时值到后来的永久值。您看到的差异正是这种变化发生时的预期。
您可以检查对象是否具有以下临时ID:
BOOL hasTempID = [[myManagedObject objectID] isTemporaryID];
您还可以在保存更改之前强制转换发生 - 例如:
NSError *error = nil;
BOOL success = [managedObjectContext obtainPermanentIDsForObjects:@[myManagedObject] error:&error];