Se eu tenho um objeto List e um objeto ListItem, e a List tem um relacionamento um-para-muitos com ListItem "s, o que parece ser o melhor design para editar uma lista? Eu busco a lista com
// Find the list we"re supposed to edit
temporaryList = [List MR_findFirstByAttribute:@"uniqueID" withValue:_editingListID];
e, em seguida, pode atualizar suas propriedades simples, como nome
temporaryList.name = @"new name";
no entanto eu estou querendo saber como melhor atualizar seus listItems. Ele é armazenado em um NSSet de acordo com a estrutura do Core Data, e eu armazeno cada ListItem com o seguinte ao criar uma nova lista.
ListItem *listItem = [ListItem MR_createInContext:_managedObjectContext];
Então, quando eu vou editar o conteúdo de uma lista, eu gostaria de redefinir seu NSSet de ListItems
// something like
list.contents = nil;
list.contents = mynewarrayoflistitems
Mas então eu também preciso de uma maneira de excluir o antigoListItems que foram salvos na memória. Como devo fazer isso? Meu primeiro pensamento foi excluir a lista que está sendo editada (o que fará com que um efeito de casacade ocorra e excluirá todos os ListItems com ele, e então redefinirá todo o conteúdo, nome, id, etc. da lista). Essa é a melhor prática?
Respostas:
1 para resposta № 1Como você já percebeu, a regra de exclusão em cascata só é aplicada quando um objeto é deletado. Por exemplo, se list
é excluído então todos os relacionados listItem
objetos também são excluídos.
E se contents
é o relacionamento de muitos a partir de List
para ListItem
, então
list.contents = nil;
não aplica nenhuma regra de exclusão e não exclui os objetos anteriormente relacionados.
Mas você pode ir ao contrário: Se a regra de exclusão para o relacionamento inverso de List
para ListItem
está definido como "Nullify", então a exclusão de um item da lista removerá a partir do relacionamento, para que você possa iterar list.contents
e excluir todos os relacionados objetos.
Isso tem a vantagem de que List
objeto em si é preservado. Então você pode criar novos itens e adicioná-los à lista.