Core data 如何将一个实体保存到另一个实体核心数据中

Core data 如何将一个实体保存到另一个实体核心数据中,core-data,swift2,Core Data,Swift2,所以我有一个用户实体和一个爱好实体,我创建了与多个用户的关系,其中一个用户可以有多个爱好。我也创造了相反的关系。我也为这些实体生成了子类,但我不确定如何将爱好实体保存到用户实体中 以下是我的用户子类: import Foundation import CoreData class Users: NSManagedObject { // Insert code here to add functionality to your managed object subclass } import

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

以下是我的用户子类:

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?

}
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?

}
以下是我的爱好子类:

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?

}
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?

}

我已经知道如何从核心数据中添加/更新/删除项目,但不知道如何将整个实体添加到另一个实体中。任何帮助都会很好!如果我做错了什么,或者思考的方式不对,请也纠正我。

首先,您必须省略一些生成的代码,因为业余爱好类中应该有一个反向关系返回给用户。我想业余爱好->用户关系对很多人来说也是如此,因为我确信“观鸟”的业余爱好会有不止一个用户

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

P>更常见的是,使用复数形式来处理许多关系,这意味着你可能想考虑将你的关系重命名为“爱好”。 您所要做的就是为给定“用户”的“爱好”关系添加一个“爱好”对象实例。无需更改这两种关系,因为核心数据将建立反向关系

这是一个完全未经测试的将ObjC转换为swift的尝试,但对于jazz来说应该足够接近了

// 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)
编辑


好的,我想我需要让当前用户添加到正确的用户。我 我想使用这个代码的东西= NSEntityDescription.insertNewObjectForEntityForName(“用户”, inManagedObjectContext:context)作为!用户爱好= addHobbyTextField.text as!NSSet,但不确定如何处理NSSet。 有什么帮助吗?——铃木3

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

var curUser = NSEntityDescription.insertNewObjectForEntityForName(
    "User",
    inManagedObjectContext: context) as! Users
然而,第二部分有点混乱。这是你写的

curUser.hobby = addHobbyTextField.text as! NSSet
我承认我对斯威夫特一无所知,但这看起来很奇怪。您正试图将字符串(文本字段中的值)强制转换为
NSSet
?这是行不通的,也没有任何意义

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

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

现在,我将抛开swift上的任何伪装,用ObjC回答,因为我认为作为swift程序员,您可以比我更好地将我在这里写的东西移植到适当的swift中,这似乎更像是一个如何使用核心数据的问题,而不是swift语法的问题(另外,您可能不希望只忽略获取中可能出现的错误)


首先,您需要创建子类,如本例所示,其中关系为多。子类(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?

}
之后,当您创建教师对象或获取现有对象,并且您创建或获取课程对象时,您可以访问课程属性“teacher”,并按如下方式进行设置(假设新课程是数学):


好的,我想我需要让当前用户添加到正确的用户中。我想使用以下代码中的内容
var curUser=NSEntityDescription.insertNewObjectForEntityForName(“用户”,在ManagedObjectContext:context中)as!Users curUser.hobby=addHobbyTextField.text as!NSSet
但不确定如何处理NSSet。有什么帮助吗?好的,谢谢Jody,我会试试。我可以翻译,我想,我会看看它是否有效。好的,这样我就可以将整个教师对象添加到数学中。教师?我不必担心NSSet?我使用了你建议的,但我“我不确定它是否向用户添加了嗜好。我不确定如何从作为NSSet的用户实体打印嗜好。有没有关于如何循环的想法?看起来这样行得通,另一个人帮我打印了数据,你的插入也行得通。所以我只需要保存到相反的位置就行了。你可以找到并访问coredata SQLite文件。”(那个是在模拟器上创建的)并用SQLPro for SQLite这样的工具打开它。在那个里你们可以看到关于实体和它们之间的连接的所有信息。