【问题标题】:Core Data relationships (swift)核心数据关系 (swift)
【发布时间】:2015-04-04 07:18:19
【问题描述】:

我正在构建一个需要核心数据关系的应用:

entityA <<---> entityB  (e.g. any given entityA can hold many entityB objects)

我有两个带有 entityA 列表项的表视图,我希望能够将 entityB 对象存储在任何给定的 entityA 对象中。

我不熟悉使用与核心数据的关系(而且对 swift 也很陌生),并且想了解如何使这项工作发挥作用。有没有人有任何快速教程可以让我看看或任何其他可以帮助我学习的资源?

对不起,如果我的问题没有多大意义,请让我澄清是否需要。

谢谢!

更新:

这里对我想要学习的内容进行了更具体的说明。

假设我有实体“Person”(属性可能包括姓名、年龄等)和一个表格视图,我的应用用户可以在其中添加一个人。 (我已经建立并知道如何适当地做)但是,现在我想添加实体“膳食”(属性可能包括食物),并且膳食是它自己的表格视图,我可以通过选择我的人来访问它想加个饭来。每个人可以多吃一顿饭,但每顿饭只能有一个人。

问题是:为了完成此任务,我的核心数据模型、fetchRequest 等会是什么样子?

希望这已经足够清楚了! :)

谢谢

这是我创建餐点的函数的代码 sn-p:

    func createMeal() {
    let entityDescription = NSEntityDescription.entityForName("Meal", inManagedObjectContext: managedObjectContext!)
    let meal = Meal(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext)

    meal.mealName = mealNameTxt.text
    meal.mealItem1 = mealItem1Txt.text

    managedObjectContext?.save(nil)
}

【问题讨论】:

  • 查看来自 raywanderlich.com 的教程的核心数据...第 3 章和第 4 章讨论了节点编辑器和构建“对多”关系,以及用于获取过滤的数据子集的不同选项。 ... 在上面的代码 sn-p 中,您将新餐与特定人联系起来?您只是在创建它并将其添加到上下文中,而无需将其与任何人实体关联。顺便说一句,您上面的“A & B”箭头指向了您所描述的错误方向。您的“Person & Meal”屏幕截图看起来正确(很多餐点),但属性名称与您的代码 sn-p 不匹配。
  • 查看我的核心数据关系演示:github.com/iMac239/CoreDataRelationshipDemo 希望对您有所帮助!

标签: ios uitableview swift core-data relationships


【解决方案1】:

嗯,这很简单。举个例子,你有一个分支,分支有很多规范。首先,您需要转到您的 xcdatamodel 并创建数据实体

然后你打开你的编辑器(表格样式)并在你的分支实体中建立关系

之后,您还需要在 branchSpecs 中设置关系错字

就是这样!您刚刚在 CoreData 实体之间创建了关系。您需要做的就是生成子类对象

现在一切就绪。您将在您的分支类中找到一个 NSSet * 对象,该对象包含该分支的数据相关规范。您还将找到一个名为 addSpecsObject 的方法,您可以使用它来存储规格对象。

以我为例的代码示例:

Branch * branch = [NSEntityDescription insertNewObjectForEntityForName:@"Branch"
                                                  inManagedObjectContext:managedObjectContext];
    branch.name = obj.name;
    branch.lattitude = obj.latitude;
    branch.longitude = obj.longitude;
    branch.dispalyedDescription = obj.dispalyedDescription;


    for (FLBranchesSpecs * spec in obj.branchSpecs) {
        BranchSpecs * branchSpec = [NSEntityDescription insertNewObjectForEntityForName:@"BranchSpecs"
                                                        inManagedObjectContext:managedObjectContext];
        branchSpec.type = @(spec.type);
        branchSpec.key = spec.key;
        branchSpec.value = spec.value;
        [branch addSpecsObject:branchSpec];
    }

    NSError *error;
    if (![managedObjectContext save:&error])
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);

与你想要的相似的东西

let person: AnyObject = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: self.managedObjectContext!)
    //do you code assignment here
    for meal in listOfMeals{
        person.addMealObject(meal)
    }
    var error: NSError?
    self.managedObjectContext?.save(&error)

【讨论】:

  • 感谢@Ashraf Tawfeeq 的回复,我相信我的应用已按照您刚才的描述设置,但现在当我向人添加餐点时(如上面的更新示例中所示),它会添加它是适当的,但是当向 personA 添加一餐并导航到 personB 以查看他们的膳食列表(与 person tableview 不同的 tableview)时,我发现 personA 和 personB 共享我刚刚添加的同一顿饭。我如何让每顿饭都针对我选择的人?谢谢
  • 你能告诉我你是如何给一个人加餐的吗?
  • 刚刚添加了示例模型的屏幕截图。这就是你想要的吗?
  • 刚刚添加了我的创建餐点功能。我不知道如何为特定的人添加餐点,这是我的问题。因为我现在的事情是 createMeal 函数为每个人创建一顿饭。对吗?
  • @AshrafTawfeeq 好吧,它不是针对特定值添加,而是针对所有值添加,解决方案是什么???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多