【问题标题】:How do I save an entity into another entity core data swift如何将实体快速保存到另一个实体核心数据中
【发布时间】:2025-11-26 00:10:02
【问题描述】:

所以我有一个用户实体和一个爱好实体,我创建了一个用户可以有多个爱好的多对多关系。我也创建了反向关系。我也为这些实体生成了子类,但我不确定如何将 Hobby 实体保存到 User 实体中。

这是我的用户子类:

import Foundation
import CoreData

class Users: NSManagedObject {
// Insert code here to add functionality to your managed object subclass

}

import Foundation
import CoreData

extension Users {

    @NSManaged var password: String?
    @NSManaged var username: String?
    @NSManaged var hobby: NSSet?

}

这是我的 Hobby 子类:

import Foundation
import CoreData

class Hobby: NSManagedObject {

// Insert code here to add functionality to your managed object subclass

}

import Foundation
import CoreData

extension Hobby {

    @NSManaged var name: String?

}

我已经弄清楚如何从核心数据中添加/更新/删除项目,但不确定如何将整个实体添加到另一个实体中。任何帮助都会很棒!如果我做错了什么或想错了,也请纠正我。

【问题讨论】:

    标签: core-data swift2


    【解决方案1】:

    首先你需要像这个例子一样创建子类,其中的关系是多的。子类(Teacher/Course+CoreDataProperties.swift)如下所示:

    import Foundation
    import CoreData
    
    extension Teacher {
    
    @NSManaged var name: String?
    @NSManaged var lastname: String?
    @NSManaged var course: NSSet?
    
    }
    

    还有这个:

    import Foundation
    import CoreData
    
    extension Course {
    
    @NSManaged var name: String?
    @NSManaged var teacher: Teacher?
    
    }
    

    之后,当您创建教师对象或获取现有对象并创建或获取课程对象时,您可以访问课程属性“教师”并像这样进行设置(假设新课程是数学):

    math.teacher = (here you add Teacher object that math course is related too)
    

    【讨论】:

    • 好的,我可以将整个 Teacher 对象添加到 math.teacher?我不必担心 NSSet?
    • 我使用了你的建议,但我不确定它是否为用户增加了爱好。我不确定如何从 NSSet 的用户实体打印爱好。关于如何循环的任何想法?
    • 看起来有效,另一个人帮我打印了数据,您的插入有效。所以我只需要保存到逆来让它工作。
    • 您可以找到并访问 coredata SQLite 文件(在模拟器上创建的那个)并使用 SQLPro for SQLite 之类的工具打开它。在那里你可以看到关于实体和它们之间的连接的所有信息。
    【解决方案2】:

    首先,您必须遗漏一些生成的代码,因为在 Hobby 类中应该有一个反向关系返回给用户。我想 Hobby -> User 关系也是对多的,因为我确信“观鸟”的爱好会有多个用户。

    如果您的代码不包含该关系,那么您的模型实际上可能不包含反向关系。

    此外,对多关系使用复数形式更为常见,这意味着您可能需要考虑将您的关系重命名为“爱好”。

    您所要做的就是将“爱好”对象实例添加到给定“用户”的“爱好”关系中。无需更改这两种关系,因为核心数据会建立反向关系。

    这是一个完全未经测试的将 ObjC 转换为 swift 的尝试,但它应该足够接近爵士乐。

    // Add 'hobby' to the set of hobbies for a given 'user'
    // The inverse relationship (add 'user' to the set of users for a given 'hobby'
    // will be automatically handled by core data
    user.mutableSetValueForKey("hobby").addObject(hobby)
    

    编辑

    好的,所以我想我需要让当前用户添加到正确的用户。一世 我想使用这个代码 var curUser = NSEntityDescription.insertNewObjectForEntityForName("用户", inManagedObjectContext:上下文)作为!用户 curUser.hobby = addHobbyTextField.text 为! NSSet 但不确定如何处理 NSSet。 有什么帮助吗? – 铃木杰克3

    所以,看起来您正在创建一个新用户...

    var curUser = NSEntityDescription.insertNewObjectForEntityForName(
        "User",
        inManagedObjectContext: context) as! Users
    

    然而,第二部分有点混乱。这是你写的……

    curUser.hobby = addHobbyTextField.text as! NSSet
    

    我承认我对 swift 的了解为零,但这看起来很奇怪。您正在尝试将字符串(文本字段内的值)转换为 NSSet?这永远行不通,也没有任何意义。

    我猜那个文本字段中的内容是一个爱好的名称,可能类似于“阅读”,也许您想添加“阅读”作为新用户的爱好。

    如果是这种情况,那么您需要根据爱好名称获取爱好对象,然后将该爱好添加到给定用户的爱好集合中。

    现在,我将放弃 swift 的任何伪装并在 ObjC 中回答,因为我想你作为 swift 程序员可以比我更好地将我在这里写的内容移植到适当的 swift 中,这似乎更像是一个如何使用核心数据而不是 swift 语法之一(此外,您可能不想仅仅忽略 fetch 中可能出现的错误)。

    // Fetch the appropriate hobby object
    NSString *hobbyName = addHobbyTextField.text;
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Hobby"];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name = %@", hobbyName];
    fetchRequest.fetchLimit = 1;
    Hobby *hobby = [[moc executeFetchRequest:fetchRequest error:NULL] firstObject];
    
    // Add the hobby to the set of hobbies for this user
    if (hobby) {
        [[user mutableSetValueForKey:@"hobby"] addObject:hobby];
    }
    

    【讨论】:

    • 好的,所以我想我需要让当前用户添加到正确的用户。我想使用此代码var curUser = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context) as! Users curUser.hobby = addHobbyTextField.text as! NSSet 的东西,但不确定如何处理 NSSet。有什么帮助吗?
    • 好的,谢谢乔迪,我会试试的。我想我可以做那个翻译,我会看看它是否有效。