首页 \ 问答 \ CoreData - 一对多关系(CoreData - One-to-many relationship)

CoreData - 一对多关系(CoreData - One-to-many relationship)

我将发布以下代码然后解释我的斗争

此功能可以节省一天(如星期日,星期一,星期二等):

func appendDaysToArray() {
        let dayLabel = dayName.text
        daysArray.append(dayLabel)

        let dayEntity = NSEntityDescription.entityForName("TrainingDay", inManagedObjectContext: moc!)
        let trainingday = TrainingDay(entity: dayEntity!, insertIntoManagedObjectContext: moc)
        trainingday.day = dayName.text

        var error: NSError?
        moc?.save(&error)

        if let err = error {
            var status = err.localizedFailureReason
            println("\(status)")
        } else {
            println("Day #\(dayName.text) saved successfully!")
        }
    }

这个节省了详细信息作为名称,一些集合和一些重复(如健身房练习):

func appendTrainingDetails () {

        let nameLabel = exerciseName.text
        namesArray.append(nameLabel)
        let numberOfSets = setsNumber.text?.toInt()
        setsArray.append(numberOfSets!)
        let numberOfReps = repsNumber.text?.toInt()
        repsArray.append(numberOfReps!)

        let detailsEntity = NSEntityDescription.entityForName("TrainingDetails", inManagedObjectContext: moc!)
        let trainingdetails = TrainingDetails(entity: detailsEntity!, insertIntoManagedObjectContext: moc)
        trainingdetails.exerciseName = exerciseName.text
        trainingdetails.setsNumber = setsNumber.text!
        trainingdetails.repsNumber = repsNumber.text!


        var error: NSError?
        moc?.save(&error)

        if let err = error {
            var status = err.localizedFailureReason
            println("\(status)")
        } else {
            println("Exercise: #\(exerciseName.text) saved successfully!")
            println("Number of sets: #\(setsNumber.text) saved successfully!")
            println("Number of reps: #\(repsNumber.text) saved successfully!")
        }
    }

我的应用程序运行正常,但我真正需要的是:对于每一天,我将有多个exerciseNames,setsNumber和repsNumber。 我设置了一对多关系,但我不知道如何将daysDetails属于daysArray中的每一天。

这是我的2个型号:

import Foundation
import CoreData

class TrainingDay: NSManagedObject {

    @NSManaged var day: String
    @NSManaged var relationship1: NSSet

}

import Foundation
import CoreData

class TrainingDetails: NSManagedObject {

    @NSManaged var exerciseName: String
    @NSManaged var repsNumber: String
    @NSManaged var setsNumber: String
    @NSManaged var relationship2: TrainingDay

}

之后,我每天都会有一个按钮,按下后,他们会用特定日期的练习列表更新tableView。 这就是我需要设置这种一对多关系的原因。

我怎样才能做到这一点?

对不起任何错误。 提前致谢!!


I'll post the following code then explain my struggle

This function saves a day (like sunday, monday, tuesday, etc):

func appendDaysToArray() {
        let dayLabel = dayName.text
        daysArray.append(dayLabel)

        let dayEntity = NSEntityDescription.entityForName("TrainingDay", inManagedObjectContext: moc!)
        let trainingday = TrainingDay(entity: dayEntity!, insertIntoManagedObjectContext: moc)
        trainingday.day = dayName.text

        var error: NSError?
        moc?.save(&error)

        if let err = error {
            var status = err.localizedFailureReason
            println("\(status)")
        } else {
            println("Day #\(dayName.text) saved successfully!")
        }
    }

and this one saves details as a name, a number of sets and a number of repetitions (like gym exercises):

func appendTrainingDetails () {

        let nameLabel = exerciseName.text
        namesArray.append(nameLabel)
        let numberOfSets = setsNumber.text?.toInt()
        setsArray.append(numberOfSets!)
        let numberOfReps = repsNumber.text?.toInt()
        repsArray.append(numberOfReps!)

        let detailsEntity = NSEntityDescription.entityForName("TrainingDetails", inManagedObjectContext: moc!)
        let trainingdetails = TrainingDetails(entity: detailsEntity!, insertIntoManagedObjectContext: moc)
        trainingdetails.exerciseName = exerciseName.text
        trainingdetails.setsNumber = setsNumber.text!
        trainingdetails.repsNumber = repsNumber.text!


        var error: NSError?
        moc?.save(&error)

        if let err = error {
            var status = err.localizedFailureReason
            println("\(status)")
        } else {
            println("Exercise: #\(exerciseName.text) saved successfully!")
            println("Number of sets: #\(setsNumber.text) saved successfully!")
            println("Number of reps: #\(repsNumber.text) saved successfully!")
        }
    }

My app is working ok, but what I actually need is this: for each DAY, I will have multiple exerciseNames, setsNumber and repsNumber. I set a one-to-many relationship, but I don't know how to attribute the TrainingDetails to each day in the daysArray.

Here are my 2 models:

import Foundation
import CoreData

class TrainingDay: NSManagedObject {

    @NSManaged var day: String
    @NSManaged var relationship1: NSSet

}

and

import Foundation
import CoreData

class TrainingDetails: NSManagedObject {

    @NSManaged var exerciseName: String
    @NSManaged var repsNumber: String
    @NSManaged var setsNumber: String
    @NSManaged var relationship2: TrainingDay

}

Later, I'll have a button for each day and, when pressed, they will update a tableView with the list of exercises for that specific day. That's why I need to set this one-to-many relationship.

How can I achieve this?

Sorry for any mistakes. Thanks in advance!!


原文:https://stackoverflow.com/questions/32013330
更新时间:2022-07-22 08:07

最满意答案

我不确定你的程序尝试做什么,但让我专注于几个明显不正确的行。

首先,在

int Choice;
scanf ("%s", &Choice);

你有错误的选择类型:它是“int”,而它应该是一个char的静态数组(让我们说char Choice [32])。 在这种情况下,您还必须删除“选择”之前的“&”,以便代码变为:

char Choice[32];
scanf ("%s", Choice);

而且,在

else if(Choice == "Energy") //This isnt working in my compiler.

你试图用运算符“==”比较两个字符串。 这在C中不起作用。您应该使用以下方式使用“strcmp”函数:

#include<string.h>
[...]
else if(strcmp(Choice, "Energy")==0)

您最好使用以下命令来防止任何缓冲区溢出

else if(strncmp(Choice, "Energy", 32)==0)

(用Choice中的最大元素数替换32)

编辑请注意,您也应该更改第一个比较

if(Choice == 2817)

if(strncmp(Choice, "2817", 32))

因为选择不再是一个int ...


I'm not sure what your program is trying to do, but let me concentrate on the few obviously incorrect lines.

First, in

int Choice;
scanf ("%s", &Choice);

you have the wrong type for Choice: it is "int" whereas it should be a static array of char (let's say char Choice[32]). In this case you also have to remove the "&" before "Choice" in the scant, so that the code becomes:

char Choice[32];
scanf ("%s", Choice);

Moreover, in

else if(Choice == "Energy") //This isnt working in my compiler.

you are trying to compare two strings with the operator "==". This does not work in C. You should use the function "strcmp" the following way:

#include<string.h>
[...]
else if(strcmp(Choice, "Energy")==0)

You'd even better use the following to prevent any buffer overflow

else if(strncmp(Choice, "Energy", 32)==0)

(replace 32 with the maximum number of elements in Choice)

Edit Note that you should change the first comparison too from

if(Choice == 2817)

to

if(strncmp(Choice, "2817", 32))

because Choice is not an int anymore...

相关问答

更多
  • 我不确定你的程序尝试做什么,但让我专注于几个明显不正确的行。 首先,在 int Choice; scanf ("%s", &Choice); 你有错误的选择类型:它是“int”,而它应该是一个char的静态数组(让我们说char Choice [32])。 在这种情况下,您还必须删除“选择”之前的“&”,以便代码变为: char Choice[32]; scanf ("%s", Choice); 而且,在 else if(Choice == "Energy") //This isnt working i ...
  • MISRA需要一个单一的return语句: (MISRA,规则14.7:必需)“函数的最后应有一个退出点” 现在,我个人认为这不是一个好的规则。 尽量减少返回语句的数量,但在增强代码的可读性时使用return语句。 例如, 守卫子句可以使你的代码更清晰,更具可读性。 我建议你阅读这篇关于duffing的文章(从上到下写代码): MISRA requires a single return statement: (MISRA, rule 14.7 : required) "A function shall h ...
  • 当速度至关重要时,SQL case语句甚至可能是最快的(我将运行测试)但是为了可维护性,将普通值返回到表示层(或某些业务层)是最佳选择。 [update]运行了一些快速而肮脏的测试(下面的代码),发现C#代码变体比SQL case变体略快。 结论:返回“原始”数据并在表示层中对其进行操作既更快又更易于维护。 -Edoode 我在下面查询了196288行。 StringBuilder result = new StringBuilder(); using (SqlConnection conn = new S ...
  • J(E)CXZ通常用于CX寄存器中的计数值,用于限制循环中的迭代次数。 JMP是一个无条件跳转,用于退出循环,在基于非CALL的接口中输入API,构建跳转表等。 条件跳转用于根据先前计算的条件来更改执行线程。 有很多同义词(记载在我刚刚提供的链接中),同义词通常是由于明显的原因。 例如,JAE的意思是“如果高于或等于跳跃”。 这是JNC的同义词,意思是“如果不携带则跳”和JNB,意思是“如果不在下面跳”。 您使用的纯粹是让读者理解代码的问题: 如果你刚刚完成算术运算,你很可能会对进位标志的状态感兴趣,所以你 ...
  • 类型SA未在您的程序中定义,编译器找不到它,您可能希望在程序中添加以下typedef: typedef struct sockaddr SA; The type SA is not defined in your program, the compiler could not find it, you might want to add following typedef to your program: typedef struct sockaddr SA;
  • 我想你只是在if ... else if .... else if ...构造之后。 另外,要保持代码清洁,请从最具体的情况开始: 如果a和b = 1; 发表声明“123 + 234” 否则如果a = 1; 发表声明“123” ELSE如果b = 1; 发表声明“234” 否则如果c = 1; 发表声明“345” 否则,如果a,b,c / = 1,则什么也不做。 (最后一行你明显可以跳过!) I think you're just after the if ... else if .... else if ...
  • if $s == $t advance_pc (offset << 2)); else advance_pc (4); beq $s, $t, offset http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html 对我来说是有条件的! if $s == $t advance_pc (offset << 2)); else advance_pc (4); beq $s, $t, offset http://www.mrc.uidaho.ed ...
  • scanf返回一个整数,表示从格式说明符成功分配的变量数。 您没有检查scanf的返回值,而是继续使用您希望它为其分配值的变量。 这总是一个错误。 scanf可能会失败,并且您的循环继续使用先前的operator值。 你应该检查一下,在这种情况下, scanf返回2.否则,它没有得到有效的输入,你的变量没有变化。 scanf returns an integer which indicates the number of variables that were succesfully assigned fr ...
  • 不要使用num。 为循环使用另一个变量,这样就不会结束更改用户值。 #define _CRT_SECURE_NO_WARNINGS #include #include int main() { int num; printf("Please enter a number from 1 to 9= "); scanf("%d", &num); int counter = 0; while (counter <= num) { printf("Owl ...
  • i=10 i=i+1 i=i+1 i=i+1 在数学中, A=B不是B到A的值的赋值。 它反而表达了一种身份。 表达式i=i+1在数学上没有意义。 一个例外是布尔代数,其中0 + 0 = 0且0 + 1 = 1 + 0 = 1 + 1 = 1。 但是,最初的身份i=10没有任何意义。 表达式i=i+1在试图最接近数学的Haskell等语言中是非法的。 对象通常在Haskell和其他纯函数语言中是不可变的。 i=10 i=i+1 i=i+1 i=i+1 In mathematics, A=B is not a ...

相关文章

更多

最新问答

更多
  • h2元素推动其他h2和div。(h2 element pushing other h2 and div down. two divs, two headers, and they're wrapped within a parent div)
  • 创建一个功能(Create a function)
  • 我投了份简历,是电脑编程方面的学徒,面试时说要培训三个月,前面
  • PDO语句不显示获取的结果(PDOstatement not displaying fetched results)
  • Qt冻结循环的原因?(Qt freezing cause of the loop?)
  • TableView重复youtube-api结果(TableView Repeating youtube-api result)
  • 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
  • SQL Server 2014版本支持的最大数据库数(Maximum number of databases supported by SQL Server 2014 editions)
  • 我如何获得DynamicJasper 3.1.2(或更高版本)的Maven仓库?(How do I get the maven repository for DynamicJasper 3.1.2 (or higher)?)
  • 以编程方式创建UITableView(Creating a UITableView Programmatically)
  • 如何打破按钮上的生命周期循环(How to break do-while loop on button)
  • C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
  • 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
  • 如何防止调用冗余函数的postgres视图(how to prevent postgres views calling redundant functions)
  • Sql Server在欧洲获取当前日期时间(Sql Server get current date time in Europe)
  • 设置kotlin扩展名(Setting a kotlin extension)
  • 如何并排放置两个元件?(How to position two elements side by side?)
  • 如何在vim中启用python3?(How to enable python3 in vim?)
  • 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
  • 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
  • Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
  • dedecms如何安装?
  • 在哪儿学计算机最好?
  • 学php哪个的书 最好,本人菜鸟
  • 触摸时不要突出显示表格视图行(Do not highlight table view row when touched)
  • 如何覆盖错误堆栈getter(How to override Error stack getter)
  • 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
  • USSD INTERFACE - > java web应用程序通信(USSD INTERFACE -> java web app communication)
  • 电脑高中毕业学习去哪里培训
  • 正则表达式验证SMTP响应(Regex to validate SMTP Responses)