Eu tenho um aplicativo que usa CoreData e eu estoutentando descobrir a melhor maneira de implementar a marcação e a filtragem por tag. Para meus propósitos, se eu estivesse fazendo isso no SQLite bruto, precisaria apenas de três tabelas, tags
, item_tags
e claro meu items
mesa. A filtragem seria tão simples quanto a união entre as três tabelas, onde apenas items
estão relacionados às tags fornecidas. Bem direto.
Mas, existe uma maneira de fazer isso no CoreData e utilizando NSFetchedResultsController
? Não parece que NSPredicate
dar a você a capacidade de filtrar junções. NSPredicate"s
não é SQL completo de qualquer maneira, então eu provavelmente estou latindoa árvore errada lá. Estou tentando evitar reimplementar meu aplicativo usando SQLite sem CoreData, pois estou gostando do desempenho que o CoreData me oferece em outras áreas. Sim, eu considerei (e construí uma implementação de teste) mergulhar no SQLite bruto que o CoreData gera, mas isso não é uma prova futura e eu quero evitar isso também.
Alguém já tentou combater a marcação / filtragem com CoreData em um UITableView
com NSFetchedResultsController
Respostas:
9 para resposta № 1Primeiro de tudo, você realmente não precisa de um Item_Tags
entidade. O Core Data pode modelar relacionamentos muitos para muitos sem a necessidade de uma entidade intermediária. Você pode ter muitos tags
relacionamento que tem um recíproco para muitos items
relacionamento e o Core Data fará toda a mágica para que isso aconteça nos bastidores.
Portanto, para configurar uma solicitação de busca para fazer o que você descreve, faça algo assim. Suponha que você tenha um tag
que representa a tag que você deseja filtrar. Escreva um predicado como este:
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"%@ IN tags", tag]];
Isso fornecerá um predicado que retorna apenas Item
s que tem tag
no seu conjunto de tags
relacionamentos. Muito fácil, né?
Lembre-se: os dados principais não são um banco de dados. É um sistema de gerenciamento de gráfico de objetos. O fato de ele usar SQL nos bastidores realmente não deve influenciar a maneira como você o usa.