【问题标题】:Properly Storing Data for One-To-Many Relationship in Core Data在核心数据中正确存储一对多关系的数据
【发布时间】:2012-05-25 16:09:06
【问题描述】:

我在尝试将数据存储在具有一对多关系的核心数据对象中时遇到 Cocoa 错误 1570

日志文件有错误:

2012-05-25 12:02:38.919 TestProject[5059:12e03]   DetailedError: {
    NSLocalizedDescription = "The operation couldn\U2019t be completed. (Cocoa error 1570.)";
    NSValidationErrorKey = conversation;
    NSValidationErrorObject = "<Messages: 0x933e190> (entity: Messages; id: 0x933e1d0 <x-coredata:///Messages/tF3A62C22-456B-41EB-B9A4-0BA1E6738A6337> ; data: {\n    conversation = nil;\n    conversationID = nil;\n    createdAt = nil;\n    messageID = nil;\n    nickname = nil;\n    originNetwork = nil;\n    text = nil;\n    timestamp = nil;\n    userImageURL = nil;\n})";
}

具体的关系是Conversations>Messages,或者一个对话可以有多个message,每个message都属于一个conversation。

在我的模型中,这两个 NSManagedObjects 都是可选的。

我的问题是,如何在 conversation 中正确存储 message 对象?

我知道它与集合有关,但我还没有正确实现它。

非常感谢任何和所有特定或抽象的代码-sn-ps!

谢谢!

【问题讨论】:

  • 看起来你的 Message 对象有很多未设置的属性(nil 值)。对于您的消息实体,所有这些都是可选的吗?
  • 这些 NSManagedObjects 是可选的是什么意思?如果conversationMessages 的反比关系并且您没有将其设置为可选,那就是错误。每次创建Messages对象时,都必须传入Conversations对象。

标签: iphone objective-c ios core-data one-to-many


【解决方案1】:

这取决于您是否使用 NSManagedObject 子类。如果你是(我喜欢这样做),你会有一个 ASConversationASMessage 类(前缀是什么),然后你有 Xcode 为你自动生成它们,你可以使用类似的东西:

NSManagedObjectContext *moc;  // exists 
ASConversation *conv = 
    [NSEntityDescription insertNewObjectForEntityForName:@"Conversation" 
                                  inManagedObjectContext:moc];
// … set values on the conv
ASMessage *msg = 
    [NSEntityDescription insertNewObjectForEntityForName:@"Message" 
                                  inManagedObjectContext:moc];
// … set other parts of the message

[conv addMessagesObject:msg];

如果您正确设置了从MessageConversation 的反向关系作为一对一,那么当您将save 发送到moc 时,都应该为您设置。

如果您没有子类,则必须使用通用方式,恕我直言,这有点痛苦。

// Assume conv and msg exist as above, but both are of NSManagedObject types
NSMutableSet *set = [conv mutableSetValueForKey:@"messages"];
// Changes to the above set are managed by Core Data for you.
[set addObject:msg];

然后像以前一样保存。请检查您是否在关系上也设置了可选 - 可可错误 1570 是“未设置强制值” - 但它也可以应用于关系。

【讨论】:

  • 昨晚终于弄明白了=p。我确实使用了子类,并且查看 Core Data 文档和 quintessential Recipe 项目向我展示了我的方法的错误。不管怎样,谢谢发帖!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多