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
最满意答案
我不确定你的程序尝试做什么,但让我专注于几个明显不正确的行。
首先,在
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...
相关问答
更多-
C编程:IF语句(C programming: IF statements)[2024-01-06]
我不确定你的程序尝试做什么,但让我专注于几个明显不正确的行。 首先,在 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语句与编程语言中的条件语句(SQL CASE Statement Versus Conditional Statements In Programming Language)[2022-11-28]
当速度至关重要时,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 ...
-
C编程。(C programming. These statements must appear the same number of times as input number)[2022-08-08]
不要使用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 ... -
数学语句和编程语句之间有区别吗?(Is there a difference between mathematical statements and programming statements? [closed])[2022-02-17]
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 ...