核心数据多对多关系

时间:2014-02-20 14:53:04

标签: ios objective-c core-data many-to-many

我有一个Android应用程序,现在我正在制作iOS版本,但我在CoreData中遇到了一些问题。

我有以下表格:

Cidade
    -cid_codigo integer primary key
    -cid_nome text
    -cid_nome_normalizado text

Anunciante
    -anu_codigo integer primary key
    -anu_nome text
    -some other values

AnuncianteCidade
    -cid_codigo integer
    -anu_codigo integer

要从表Cidade获取所有数据,我使用以下方法:

+(NSMutableArray *)getAllCidades{
    NSMutableArray *retorno = [[NSMutableArray alloc] init];

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Cidade" inManagedObjectContext:context];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];

    //WHERE CLAUSE
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"1 = 1"];
    [request setPredicate:pred];

    NSError *error;
    NSArray *cidades = [context executeFetchRequest:request error:&error];

    if([cidades count] == 0){
        NSLog(@"Nenhuma cidade encontrada");
    }else{
        for(NSManagedObject *cidade in cidades){
            Cidade *c = [[Cidade alloc] init];
            [c initWithCodigo:[[cidade valueForKey:@"cid_codigo"] integerValue] nome:[cidade valueForKey:@"cid_nome"] nomeNormalizado:[cidade valueForKey:@"cid_nome_normalizado"]];
            [retorno addObject:c];
        }
    }

    return retorno;
}

但是现在,根据Cidade的名字,我想从Anunciante获得与此Cidade相关的所有数据。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

核心数据不是数据库。核心数据是一个碰巧持久存储到磁盘的对象图,Core Data可以持久保存的格式之一是数据库结构。这是一个重要的区别,可以帮助您继续前进。

首先,您无法仅在-init上致电NSManagedObject。这不会起作用,因为它不是NSManagedObject的指定初始值设定项。我建议你阅读核心数据并学习如何站起来核心数据堆栈。

话虽如此,您的Cidade个对象应该引用Anunciante。连接表是Core Data的内部,您也无权访问它。获取Anunciante对象的所有Cidade个对象就是简单地请求对象:

给定NSArrayCidade个对象:

NSArray *objects = ...;
for (NSManagedObject *object in objects) {
  NSSet *anunciantes = [object valueForKey:@"anunciante"];
}

这假设您在CidadeAnunciante实体之间的Core Data模型编辑器中定义了多对多关系。

答案 1 :(得分:1)

除了马库斯的答案之外,我还要补充说,谓词"1 = 1"可能会被遗漏。

要将托管对象插入上下文,请使用NSEntityDescription类方法:

Cidade *cidade = [NSEntityDescription insertNewObjectForEntityForName:@"Cidade" 
      inManagedObjectContext:context];

cidade的所有“anunciantes”将以NSSet方便地提供给您:

cidade.anunciantes

就是你所需要的一切。