保存到核心数据“ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet

Posted

技术标签:

【中文标题】保存到核心数据“ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet【英文标题】:Saving to Core Data "The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet 【发布时间】:2017-08-05 03:14:51 【问题描述】:

当我尝试保存与核心数据的关系时,它会在标题中引发上述错误。我基本上是在创建一个消息传递应用程序并附加了数据模型。在尝试保存到其他关系时,这也是同样的事情。我可以一次保存我的所有数据模型,还是应该一次保存一个,然后在保存模型及其常规属性后返回并添加关系。 **Data Model Visual

    static func save(sender: UserCD, message: String) -> Conversation? 

    let convo: Conversation? = nil

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else 
        return convo
    

    if #available(ios 10.0, *) 

        let context = appDelegate.persistentContainer.viewContext

        let now = Date()

        let messageEntity = NSEntityDescription.entity(forEntityName: "Message", in: context)
        let newMessage = NSManagedObject(entity: messageEntity!, insertInto: context) as! Message

        let conversationEntity = NSEntityDescription.entity(forEntityName: "Conversation", in: context)
        let newConvo = NSManagedObject(entity: conversationEntity!, insertInto: context) as! Conversation

        newMessage.setValue(UUID().uuidString, forKey: "messageId")
        newMessage.setValue(message, forKey: "text")
        newMessage.setValue(now, forKey: "timestamp")
        newMessage.setValue(sender, forKey: "sender")

        newConvo.setValue(UUID().uuidString, forKey: "conversationId")
        newConvo.setValue(now, forKey: "startDate")
        newConvo.setValue(now, forKey: "lastMessageDate")
        newConvo.addMessage(message: newMessage)

        sender.addMessage(message: newMessage)
        sender.addConversation(conversation: newConvo)

        do 
            try newMessage.managedObjectContext?.save()
            try sender.managedObjectContext?.save()
            try newConvo.managedObjectContext?.save()

            return newConvo

         catch 
            let saveError = error as NSError
            print("Failed to save conversastion: \(saveError.debugDescription)")
        
    
    return convo

“newConvo.addMessage(message: newMessage)”行失败

    @NSManaged public var messages: Message?

func addMessage(message: Message) 
    let messages = self.mutableSetValue(forKey: "messages")
    messages.add(message)

【问题讨论】:

【参考方案1】:

错误信息

ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet

很清楚:

您将 messages 声明为 to-one 关系 Message

方法addMessage的发送者必须是to-many关系Set<Message>

【讨论】:

以上是关于保存到核心数据“ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存和加载到多个实体

最佳核心数据保存策略(何时将数据保存到磁盘)

将图像保存到核心数据?

如何在保存到核心数据之前验证上下文中的值

核心数据不保存到 sqlite 数据库

将更改 NSManagedObject 保存到核心数据失败