核心数据=>添加相关对象总是为零

时间:2010-03-18 17:14:44

标签: iphone core-data

我有两个相关的表:DataEntered和Model

DataEntered -currentModel

模型

一个DataEntered只能有一个Model,但Model可以保留在很多DataEntered中。

关系是从DataEntered到Model(No To Many-relathionship),没有反比关系。

XCode为DataEnteredModel生成setter:

@property (nonatomic, retain) NSSet * current_model;

- (void)addCurrent_modelObject:(CarModel *)value;
- (void)addCurrent_model:(NSSet *)value;

我有一个表,当我选择一个模型时,我想将它存储到DataEntered:

Model *model = [fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"Model %@",model.name); // ==> gives me the correct model name
[dataEntered addCurrent_modelObject:model]; // ==> always nil
[dataEntered setCurrent_model:[fetchedResultsController objectAtIndexPath:indexPath]]; // the same, always nil

我做错了什么?????

感谢,

编辑:

你是对的,首先我有一个多对多的关系,而XCode生成了实体代码,这就是为什么在更改了关系之后它仍被设置为SET。

现在我重新生成了实体,现在我拥有了这样的属性:

@property (nonatomic, retain) CarModel * current_car_model;

但我仍然遇到同样的问题。

现在,我添加了反向关系并重新生成了实体。两个实体都有TO-One关系。还有同样的问题。

好的,另一个尝试:从模型到DataEntered的关系现在是To-Many。再次重新生成entites,现在为模型分配:

Model *model = [fetchedResultsController objectAtIndexPath:indexPath];

[dataEntered addCurrent_modelObject:model];

最后,这两个关系都是很多。存在同样的问题。

但我不明白为什么在这种情况下我必须有一个反比关系。

要恢复:在这种情况下我如何定义我的关系?

DataEntered只能有一个模型。

每个模型都可以与许多DataEntered相关联。

在SQL数据库定义中,具有存储在DataEntered中的简单longint字段中的模型的id的字段就足够了。当重新对比很多时,我无法在.sqlite数据库中看到该字段,现在我再次更改为To-One,我可以看到current_model字段为整数。但同样,我在Model表中有一个带有相关DataEntered的字段,我认为这是错误的,因为我不会在这里存储Nothing。

任何亮点都会受到赞赏......

: - )

谢谢.....

2 个答案:

答案 0 :(得分:3)

如果您的属性是作为一个集创建的,那么您没有将其设置为一对一关系,而是设置为多对多关系。所以这个:

@property (nonatomic, retain) NSSet * current_model;

...表示多人关系。

如果您的模型实体与DataEntered实体有关系,但您没有设置相同的互惠关系,则可能会出现问题。

编辑:

我认为你的主要问题是你将Core Data视为一种SQL形式,而不是。实体不是表格。对象不是记录。核心数据是一个对象图,对象图与SQL有很大不同。首先,可以在Core Data中有一个孤立对象,但是你不能真正丢失SQL中的记录。这就是Core Data真正想要互惠关系的原因。

不要用SQL术语思考,你应该把它当作没有核心数据从头开始创建对象图。如果你自己从头开始编写一个DataEntered类和一个模型类,你将如何处理它?你会如何手动关联它们。从这个角度来看,核心数据更容易理解。

我会提供您选择的实体名称可能会导致问题。看起来你的模型实体实际上名为“_model”。 Apple保留以下划线开头的符号,“模型”当然可以很容易地在Core Data内部显示,因此您可能会发生名称冲突。如果您喜欢下划线,请尝试将名称更改为“CarModel”,将其更改为“CarModel_”。

此外,“DataEntered”实体/类似乎命名不佳。 “数据输入”是一个动作而不是一个对象。实体/类应表示一些物理或数据对象。例如,“CustomerCar”将是对汽车进行建模的实体/类,而汽车又与“CarModel”实体/类具有“模型”关系。

当描述图形的人是新手时,用对象图的文本描述来调试核心数据非常非常困难,尤其是(没有冒犯)。如果您可以拍摄数据模型编辑器的屏幕截图并发布,那么我们可以看到它会有所帮助。

答案 1 :(得分:0)

好吧,最后我发现了问题。

dataEntered是nil ............

我不习惯在没有错误的情况下为nil对象赋值......

: - )

我并不冒犯,我真的是Core Data的新手,但不是SQL,但因为我的方法不起作用,最后我四处乱窜......

谢谢,抱歉!

的问候,