Saya menggunakan Data Inti untuk mempertahankan hasil dari panggilan Layanan Web secara lokal. Layanan web mengembalikan model objek penuh untuk, katakanlah, "Mobil" - bisa sekitar 2000 di antaranya (dan saya tidak bisa membuat Layanan Web mengembalikan apa pun yang kurang dari 1 atau SEMUA mobil.
Lain kali saya membuka aplikasi saya, saya ingin menyegarkan salinan Core Data yang bertahan dengan memanggil Layanan Web untuk semua Mobil lagi, namun untuk mencegah duplikat saya harus membersihkan semua data dalam cache lokal terlebih dahulu.
Apakah ada cara yang lebih cepat untuk membersihkan SEMUA instance entitas tertentu dalam konteks objek yang dikelola (misalnya semua entitas tipe "CAR"), atau apakah saya perlu meminta mereka memanggil, lalu beralih melalui hasil untuk menghapus masing-masing, lalu menyimpan?
Idealnya saya bisa mengatakan hapus semua di mana entitas Blah.
sumber
Jawaban:
iOS 9 dan yang lebih baru:
iOS 9 menambahkan kelas baru yang disebut
NSBatchDeleteRequest
yang memungkinkan Anda untuk dengan mudah menghapus objek yang cocok dengan predikat tanpa harus memuat semuanya ke dalam memori. Begini cara Anda menggunakannya:Cepat 5
Objektif-C
Informasi lebih lanjut tentang penghapusan kumpulan dapat ditemukan di sesi "Apa yang Baru di Data Inti" dari WWDC 2015 (mulai ~ 14: 10).
iOS 8 dan sebelumnya:
Ambil semuanya dan hapus semuanya:
sumber
Setel Ulang Entitas di Swift 3 :
sumber
Sedikit lebih bersih dan universal: Tambahkan metode ini:
sumber
Untuk Swift 2.0:
sumber
Cepat:
sumber
Ini adalah pertanyaan yang mirip dengan yang ada di sini dan seseorang menyarankan untuk menyiapkan aturan penghapusan hubungan sehingga Anda hanya perlu menghapus satu objek. Jadi, jika Anda memiliki atau dapat membuat entitas dengan hubungan ke-banyak ke mobil dan mengatur aturan hapus ke kaskade ketika Anda menghapus entitas yang lebih tinggi semua mobil akan dihapus juga. Ini dapat menghemat waktu pemrosesan karena Anda tidak perlu melakukan langkah-langkah yang terkait dengan memuat SEMUA mobil. Dalam kumpulan data yang lebih besar ini bisa mutlak diperlukan.
sumber
Jawaban yang bagus sudah diposting, ini hanya rekomendasi!
Cara yang baik adalah dengan hanya menambahkan kategori
NSManagedObject
dan menerapkan metode seperti yang saya lakukan:File Header (mis.
NSManagedObject+Ext.h
)File Kode: (mis. NSManagedObject + Ext.m)
... satu-satunya hal yang harus Anda lakukan adalah untuk mendapatkan managedObjectContext dari delegasi aplikasi, atau di mana setiap Anda memilikinya;)
setelah itu Anda bisa menggunakannya seperti:
satu optimasi lebih lanjut bisa jadi Anda menghapus parameter untuk thname entitas dan mendapatkan nama bukan dari clazzname. ini akan menyebabkan penggunaan:
imp yang lebih bersih (sebagai kategori untuk NSManagedObjectContext):
Penggunaannya kemudian:
sumber
[AppDelegate managedObjectContext]
tidak harus "arsitektur bersih" .. ;-)deleteAllFromEntity: inManagedObjectContext:
Pembaruan Swift 4, iOS 12 dan Xcode 10
100% berfungsi cukup potong & tempel
Cukup letakkan fungsi ini di kelas yang relevan dan panggil fungsi ini
self.deleteData()
diviewDidLoad()
atau di mana saja atau di bawah fungsi atau tombol sehingga dengan mengklik tombol semua data dari entitas harus dihapus dan ganti "myEntity" sebagai entitas Anda yang telah Anda tentukan di data intisumber
Swift 3.X dan Swift 4.X , Cara mudah. Ubah hanya YourTable
sumber
iOS 10 dan yang lebih baru
Bekerja dengan semua versi. Lulus nama entitas dan ulangi untuk menghapus semua entri dan menyimpan konteks.
sumber
CoreDataStack()
atau apaDataController()
. Pembaruan akan dihargai;)Memperluas jawaban Dave Delong.
Versi Swift yang menangani iOS 9 dan versi sebelumnya juga. Saya juga membahas penanganan Kesalahan dalam hal ini:
biarkan appDelegate: AppDelegate = UIApplication.sharedApplication (). delegasikan sebagai! AppDelegate
sumber
Mengapa tidak melipat data yang Anda terima dengan cache yang ada? Kalau tidak, itu tidak benar-benar 'menyegarkan', itu 'mulai lagi' dan Anda mungkin juga drop / menghapus file SQLLite dan mulai lagi (dengan asumsi Anda tidak bertahan data lain juga).
sumber
Swift 4, iOS 10+
Fungsi statis yang dapat diterapkan untuk entitas apa pun untuk menghapus semua datanya
'Kamar' adalah sebuah entitas
Diedit pada 20191025: instruksi "Self.fetchRequest ()" dapat menyebabkan masalah jika kita menggunakan beberapa target dalam proyek yang sama. Jadi diganti dengan NSFetchRequest (entityName: String (menggambarkan: self))
sumber
jika entitas berisi banyak entri, cara terbaik adalah seperti ini karena menghemat memori
sumber
Di Swift 3.0
sumber
Kode ini akan berfungsi untuk iOS 9 dan di bawah
sumber
iOS 9.0 dan Selanjutnya:
NSBatchDeleteRequest
digunakan untuk menghapus catatan dalam data inti. Ini bekerja sangat cepat dan membutuhkan waktu lebih sedikit untuk menghapus semua catatan dari suatu entitas. Itu membutuhkanNSFetchRequest
argumen. Jika Anda ingin menghapus semua catatan dari suatu entitas, Anda dapat menggunakannya dan berfungsi untuk saya.sumber
pembersihan cepat semua objek di DB:
sumber
Jawaban Swift 2.0 dari Dave Delongs tidak cocok untuk saya (di iOS 9)
Tetapi ini berhasil:
sumber
Solusi Swift 3 dengan iOS 9 'NSBatchDeleteRequest' dan fallback ke versi iOS sebelumnya diimplementasikan sebagai ekstensi pada 'NSManagedObjectContext'. Referensi Apple https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
sumber
Gunakan NSBatchDeleteRequest untuk menghapus beberapa catatan Jika Minimum iOS adalah 9.0. Jika utas latar belakang, jalankan NSManagedObjectContext simpan yang lain gunakan NSFetchRequest untuk mendapatkan catatan dan menghapus semua catatan untuk loop dan Simpan setelah penghapusan dilakukan.
sumber
di iOS 11.3 dan Swift 4.1
Anda harus memanggil ulang setelah Anda menjalankan. Jika tidak, itu tidak akan diperbarui pada tampilan tabel.
sumber
sumber
cara OOP tanpa string sebagai nama entitas Swift 3+, Xcode 10+
maka cukup panggil do / catch block
sumber
Dalam Swift 2.0:
sumber