我有一个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相关的所有数据。
我该怎么做?
答案 0 :(得分:2)
核心数据不是数据库。核心数据是一个碰巧持久存储到磁盘的对象图,Core Data可以持久保存的格式之一是数据库结构。这是一个重要的区别,可以帮助您继续前进。
首先,您无法仅在-init
上致电NSManagedObject
。这不会起作用,因为它不是NSManagedObject
的指定初始值设定项。我建议你阅读核心数据并学习如何站起来核心数据堆栈。
话虽如此,您的Cidade
个对象应该引用Anunciante
。连接表是Core Data的内部,您也无权访问它。获取Anunciante
对象的所有Cidade
个对象就是简单地请求对象:
给定NSArray
个Cidade
个对象:
NSArray *objects = ...;
for (NSManagedObject *object in objects) {
NSSet *anunciantes = [object valueForKey:@"anunciante"];
}
这假设您在Cidade
和Anunciante
实体之间的Core Data模型编辑器中定义了多对多关系。
答案 1 :(得分:1)
除了马库斯的答案之外,我还要补充说,谓词"1 = 1"
可能会被遗漏。
要将托管对象插入上下文,请使用NSEntityDescription
类方法:
Cidade *cidade = [NSEntityDescription insertNewObjectForEntityForName:@"Cidade"
inManagedObjectContext:context];
cidade的所有“anunciantes”将以NSSet
方便地提供给您:
cidade.anunciantes
就是你所需要的一切。