Ao excluir um objeto CoreData, como excluir também todos os seus objetos relacionados no Swift5?

Nov 28 2020

Atualmente estou trabalhando com CoreData.

Problema: Eu tenho um CoreData Entidade usuário com um one-to-many-relationshipa outro CoreData Entidade Badges . Agora estou tentando excluir um usuário e, obviamente, também gostaria de excluir todos os seus emblemas .

Excluir o próprio usuário é bastante simples:

context.delete(selectedUser)

No entanto, primeiro tenho que excluir todos os crachás do usuário. Esta é a parte complicada para mim:

for badge in selectedUser.badges {
    context.delete(badge)
}

Ao fazer isso, ocorre este erro: Não é possível converter o valor do tipo 'NSSet.Element' (também conhecido como 'Qualquer') para o tipo de argumento esperado 'NSManagedObject'

Minha Solução possível: Eu estava pensando em simples downcasting: context.delete(badge as! NSManagedObject). No entanto, não tenho certeza se isso é possível.

Pergunta: Qual é a melhor prática para atingir a meta que descrevi acima? Ou existe talvez uma maneira CoreData de excluir recursivamente todos os objetos relacionados?

Obrigado pela ajuda.

Respostas

1 MartinR Nov 28 2020 at 18:20

selectedUser.badgesé um NSSetde Badges, portanto, você pode lançar seus elementos para Badgeou para NSManagedObject:

for badge in selectedUser.badges {
    context.delete(badge as! NSManagedObject)
}

Você também pode lançar o NSSetpara sua contraparte Swift Set:

for badge in selectedUser.badges as! Set<Badge> {
    context.delete(badge)
}

Mas para excluir todos os objetos relacionados se um usuário for excluído, a solução simples é definir a “Regra de exclusão” para o relacionamento como “Cascata”.