ios - 托管对象在获取时具有不同的 id
<p><p>我正在使用 coredata 并且有一个我没有得到的概念;我有 2 个具有一对多关系的托管对象 ACConversation 和 ACMessages,因此我正在保存与对话关联的消息并尝试根据以下条件取回它们:</p>
<pre><code>NSPredicate *predicate = ;
</code></pre>
<p>但是与对象关联的 id 是不同的(它似乎更像是一个内存地址)并且使用上述谓词它不会获取任何东西:</p>
<pre><code>2013-01-01 18:32:13.727 CoreDataTest 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 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 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 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>"
);
})
</code></pre>
<p>代码下方:</p>
<pre><code>- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController) {
NSLog(@"_fetchedResultsController found: %@", _fetchedResultsController);
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = ;
NSError __autoreleasing *error = nil;
NSUInteger messagesCount = ;
NSAssert(messagesCount != NSNotFound, @"- error:\n\n%@", error);
if (messagesCount > MESSAGE_COUNT_LIMIT) {
;
}
;
initWithKey:@"sentDate" ascending:YES]]];
/*
NSPredicate *predicate = ;
;
//NSLog(@"Predicate: %@", predicate);
*/
_fetchedResultsController = [ initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"ACMessage"];
_fetchedResultsController.delegate = self;
NSAssert(, @"- error:\n\n%@", error);
return _fetchedResultsController;
}
- (void) setSimpleData
{
self.conversation = ;
self.conversation.lastMessageSentDate = ;
ACUser *user = ;
;
;
;
ACMessage *message = ;
self.conversation.lastMessageSentDate = message.sentDate = ;
self.conversation.lastMessageText = message.text = @"Test message to Fetch through relationship!!!";
;
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 (![ save:&error]) {
//Make sure you handle this!
NSLog(@"ERROR: Can't save object context");
exit(-1);
}
}
- (void) getSimpleData
{
NSError *error;
if (![ performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, );
exit(-1);// Fail
}
NSInteger section = 0;
idsectionInfo = [[ sections] objectAtIndex:section];
if (>0) {
NSIndexPath *my0 = ;
ACMessage *message = ;
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!");
}
}
</code></pre>
<p>我是否遗漏了什么,或者我必须在 ACConversation 中设置一个 id 并在 NSPredicate 中使用它来查找与对话关联的所有消息?</p>
<p>谢谢!
亚历克斯</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>当你第一次创建一个托管对象时,它有一个临时的<code>objectID</code>。当您保存更改时,它会更改为永久的 <code>objectID</code>。这是它唯一一次改变——从最初的临时值变为后来的永久值。您看到的差异正是发生这种变化时的预期结果。</p>
<p>您可以像这样检查对象是否具有临时 ID:</p>
<pre><code>BOOL hasTempID = [ isTemporaryID];
</code></pre>
<p>您还可以强制转换提前发生 - 在您保存更改之前 - 像这样:</p>
<pre><code>NSError *error = nil;
BOOL success = error:&error];
</code></pre></p>
<p style="font-size: 20px;">关于ios - 托管对象在获取时具有不同的 id,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/14115646/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/14115646/
</a>
</p>
页:
[1]