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

时间:2015-10-27 14:43:18

标签: core-data swift2

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

以下是我的用户子类:

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?

}

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

2 个答案:

答案 0 :(得分:0)

首先,你必须省略一些生成的代码,因为在Hobby类中应该有一个反向关系回到用户。我想象的是爱好 - >用户关系也很多,因为我确定了#Bird; Bird Watching"将有多个用户。

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

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

你所要做的就是添加一个" Hobby"对象实例到"业余爱好"给定"用户"的关系。无需更改两个关系,因为核心数据将建立反向关系。

这是一个完全未经测试的将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("用户&#34 ;,   inManagedObjectContext:context)as!用户curUser.hobby =   addHobbyTextField.text为! NSSet但不确定如何处理NSSet。   对此有何帮助? - Suzukijak3

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

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

然而,第二部分有点令人困惑。你写了这个......

curUser.hobby = addHobbyTextField.text as! NSSet

我承认知道ZERO很快,但这看起来很奇怪。您正在尝试将字符串(文本字段中的值)转换为NSSet?这将永远不会奏效,而且没有任何意义。

我猜这个文本字段中的内容是一个爱好的名称,也许类似于"阅读"也许你想添加"阅读"作为新用户的爱好。

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

现在,我将脱离任何快速的假装,并在ObjC中回答,因为我想象你作为快速的程序员可以将我在这里所写的内容移植到比我更好的适当的快速,这似乎更像是一个如何的问题使用核心数据而不是swift语法之一(另外,您可能不希望仅忽略获取中可能出现的错误)。

// 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];
}

答案 1 :(得分:0)

首先,您需要创建子类,例如此示例中的关系是多个。子类(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)