如何连接核心数据中的实体

时间:2013-10-13 07:39:23

标签: database cocoa core-data

我有三个实体 - 文件,对象和产品。

文件有: id - int64 contragentId - int64 paymentMethod - 字符串 documentDate - 日期 documentKind - String

对手有 id - int64 name - 字符串 地址 - 字符串

产品有 id - int64 sku - 字符串 productQuantity - int64 description - 字符串 unitValue - 十进制 totalValue - 十进制 isTemp - Bool

我已经实现了子类化模型的产品和totalValue = quantity * unitValue

我希望在另一个表中保留所有文档,但我不知道如何显示Contragent.name 我应该使用 Document.contragentId = Contragent.id

    - (IBAction) createDocument:(id)sender
{
    //create new document
NSManagedObject *document = [NSEntityDescription
                             insertNewObjectForEntityForName:@"Documents"
                             inManagedObjectContext:self.managedObjectContext];

NSNumber *num = [NSNumber numberWithInteger: [_documentNumber integerValue]];
[document setValue: num  forKey:@"id"];
[document setValue: [_documentKind stringValue]  forKey:@"documentKind"];
[document setValue: [_documentDate dateValue]  forKey:@"documentDate"];
[document setValue: [_paymentMethod stringValue]  forKey:@"paymentMethod"];
[_documentNumber setIntegerValue:[_documentNumber integerValue]+1];

//get ID
//NSString *contragentId = [[_contragents selectedObjects] valueForKey:@"eik"];
//NSLog(@"The customer ID is: %@", contragentId);

document.contragent = [_contragents selectedObjects];

1 个答案:

答案 0 :(得分:0)

使用Core Data,不会使用“外键”来标识另一个表的行,而是使用实体之间的关系

因此,您应该定义一个关系“contragent”,而不是contragentId。 从“文档”实体到“Contragent”实体。 (我使用了单数形式“Contragent”,因为这似乎更自然。但我不知道什么是contragent 是。)

您还应该定义从“Contragent”到“Doc​​ument”的“反向关系”。 如果“Contragent”对象可以连接到几个“Document”对象,则反之 关系是“对多”,否则“对一”。

然后你建立关系只是设置关系:

Document *theDocument = ...
Contragent *theContragent = ...
theDocument.contragent = theContragent; // --> connected!

获取文档的contragent名称:

Document *theDocument = ...
NSString *contrName = theDocument.contragent.name;