2014-02-20 164 views
1

我有一個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一個名字,我想獲取與此Cidade相關聯的Anunciante的所有數據。

我該怎麼做?

回答

2

核心數據不是數據庫。核心數據是碰巧堅持到磁盤的對象圖形,核心數據可以堅持的格式之一是數據庫結構。這是一個重要的區別,可以幫助您繼續前進。

首先,你不能只打-initNSManagedObject。這將不起作用,因爲它不是NSManagedObject的指定初始化程序。我建議你閱讀Core Data並學習如何站起來核心數據堆棧。

話雖如此,你的Cidade對象應引用Anunciante。連接表是核心數據的內部,您無權訪問它,也不應該訪問它。爲了讓所有的Anunciante對象的Cidade目的是簡單地請求的對象:

鑑於CidadeNSArray的對象:

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

這是假設你有許多在覈心定義了很多關係數據模型編輯器在CidadeAnunciante實體之間。

+0

不應該是'NSSet * anunciantes ...' –

+0

是的,已更正。謝謝。 –

1

除了馬庫斯的回答,我會補充說一個謂詞"1 = 1"可以簡單地省略。

要插入一個管理對象到上下文中,您使用NSEntityDescription類方法:

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

所有一CIDADE的「anunciantes」將方便地提供給你作爲一個NSSet

cidade.anunciantes 

是你所需要的全部。