Saat menghapus Objek CoreData, bagaimana cara juga menghapus semua Objek terkait di Swift5?

Nov 28 2020

Saya sedang bekerja dengan CoreData.

Masalah: Saya memiliki Pengguna Entitas CoreData dengan Lencanaone-to-many-relationship Entitas CoreData lainnya . Sekarang saya mencoba menghapus Pengguna dan, tentunya, juga ingin menghapus semua Lencananya .

Menghapus Pengguna itu sendiri cukup mudah:

context.delete(selectedUser)

Namun saya harus terlebih dahulu menghapus semua Lencana Pengguna. Ini adalah Bagian yang rumit bagi saya:

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

Saat melakukannya, Kesalahan ini terjadi: Tidak dapat mengonversi nilai jenis 'NSSet.Element' (alias 'Any') menjadi jenis argumen yang diharapkan 'NSManagedObject'

Kemungkinan Solusi saya: Saya berpikir untuk downcasting sederhana: context.delete(badge as! NSManagedObject). Namun saya tidak yakin apakah ini mungkin.

Pertanyaan: Apa Praktik terbaik untuk mencapai Sasaran yang saya jelaskan di atas? Atau mungkinkah ada cara CoreData untuk menghapus semua Objek terkait secara rekursif?

Terima kasih atas bantuan Anda.

Jawaban

1 MartinR Nov 28 2020 at 18:20

selectedUser.badgesadalah NSSetdari Badges, oleh karena itu Anda dapat mentransmisikan elemennya ke Badgeatau ke NSManagedObject:

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

Anda juga dapat mentransmisikan NSSetke mitra Swift-nya Set:

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

Namun untuk menghapus semua objek terkait jika pengguna dihapus, solusi sederhananya adalah dengan menyetel "Aturan Penghapusan" untuk hubungan ke "Bertingkat".