Apakah Anda tahu cara untuk menghapus semua entri yang disimpan dalam Data Inti? Skema saya harus tetap sama; Saya hanya ingin mengatur ulang ke kosong.
Edit
Saya mencari untuk melakukan ini secara terprogram sehingga pengguna pada dasarnya dapat menekan reset
tombol.
ios
cocoa
cocoa-touch
core-data
nsmanagedobject
Michael Grinich
sumber
sumber
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880Jawaban:
Anda masih dapat menghapus file secara terprogram, menggunakan metode NSFileManager: removeItemAtPath ::.
Kemudian, tambahkan saja toko persisten kembali untuk memastikan itu dibuat kembali dengan benar.
Cara terprogram untuk iterasi melalui masing-masing entitas lebih lambat dan rentan terhadap kesalahan. Penggunaan untuk melakukannya dengan cara itu adalah jika Anda ingin menghapus beberapa entitas dan bukan yang lain. Namun Anda masih perlu memastikan bahwa Anda mempertahankan integritas referensial atau Anda tidak akan dapat mempertahankan perubahan Anda.
Hanya menghapus toko dan membuatnya kembali cepat dan aman, dan tentu saja dapat dilakukan secara terprogram saat runtime.
Pembaruan untuk iOS5 +
Dengan diperkenalkannya penyimpanan biner eksternal (memungkinkanExternalBinaryDataStorage atau Simpan di File Rekaman Eksternal) di iOS 5 dan OS X 10.7, cukup menghapus file yang diarahkan oleh storeURL tidak cukup. Anda akan meninggalkan file rekaman eksternal. Karena skema penamaan file rekaman eksternal ini bukan untuk publik, saya belum memiliki solusi universal. - dan 8 Mei '12 pada pukul 23:00
sumber
Anda dapat menghapus file SQLite - tetapi saya memilih untuk melakukannya dengan membersihkan tabel satu per satu dengan fungsi:
Alasan saya memilih untuk melakukan itu tabel demi tabel adalah karena hal itu membuat saya mengkonfirmasi karena saya melakukan pemrograman yang menghapus isi tabel itu masuk akal dan tidak ada data yang lebih baik saya simpan.
Melakukan ini akan jauh lebih lambat daripada hanya menghapus file dan saya akan berubah menjadi penghapusan file jika saya metode ini terlalu lama.
sumber
Solusi yang Diperbarui untuk iOS 10+
Gunakan
NSBatchDeleteRequest
untuk menghapus semua objek dalam entitas tanpa harus memuatnya ke dalam memori atau mengulanginya.Kode ini telah diperbarui untuk iOS 10 dan Swift 3. Jika Anda perlu mendukung iOS 9, lihat pertanyaan ini .
Sumber:
sumber
moc.performBlockAndWait({ () -> Void in
...})
.Saya telah menulis
clearStores
metode yang melewati setiap toko dan menghapusnya baik dari koordinator dan sistem file (penanganan kesalahan dikesampingkan):Metode ini ada di dalam
coreDataHelper
kelas yang menangani (antara lain) menciptakan persistentStore saat nihil.sumber
Saya menghapus semua data dari data inti pada Acara tombol di kelas HomeViewController: Artikel ini sangat membantu saya, saya pikir saya akan berkontribusi.
Perhatikan bahwa untuk memanggil self.persistentStoreCoordinator saya mendeklarasikan properti di Home View Controller. (Jangan khawatir tentang conto managedObjectContext yang saya gunakan untuk menyimpan dan memuat.)
Kemudian di AppDelegate ApplicationDidFinishLaunching tepat di bawah ini membuat HomeViewController yang saya miliki:
sumber
MagicalRecord membuat ini sangat mudah.
sumber
MR_truncateAll
?iOS9 +, Swift 2
Hapus semua objek di semua entitas
sumber
[Terlambat menjawab sebagai balasan atas karunia yang meminta tanggapan yang lebih baru]
Melihat jawaban sebelumnya,
Tetapi ada pendekatan berbeda yang serupa untuk menghapus toko persisten yang berfungsi. Kuncinya adalah menempatkan file toko tetap Anda di sub-direktori sendiri yang tidak mengandung hal lain. Jangan hanya menempelkannya di direktori dokumen (atau di mana pun), buatlah sub-direktori baru hanya untuk toko persisten. Isi direktori itu pada akhirnya akan menjadi file store persisten, file jurnal, dan file biner eksternal. Jika Anda ingin menghapus seluruh penyimpanan data, hapus direktori itu dan semuanya akan hilang.
Anda akan melakukan sesuatu seperti ini ketika menyiapkan toko tetap Anda:
Lalu ketika Anda ingin menghapus toko,
Itu secara rekursif menghapus sub-direktori kustom dan semua file Core Data di dalamnya.
Ini hanya berfungsi jika Anda belum memiliki toko tetap di folder yang sama dengan data penting lainnya . Seperti direktori dokumen, yang mungkin memiliki hal-hal berguna lainnya di dalamnya. Jika itu situasi Anda, Anda bisa mendapatkan efek yang sama dengan mencari file yang Anda lakukan ingin menyimpan dan menghapus segala sesuatu yang lain. Sesuatu seperti:
Pendekatan ini mungkin rawan kesalahan . Anda harus benar-benar yakin bahwa Anda tahu setiap file yang ingin Anda simpan, karena jika tidak, Anda dapat menghapus data penting. Di sisi lain, Anda dapat menghapus file biner eksternal tanpa benar-benar mengetahui nama file / direktori yang digunakan untuk menyimpannya.
sumber
Berikut ini adalah solusi gabungan untuk membersihkan Data Inti.
sumber
Jika Anda ingin menghapus semua objek dan tidak ingin menghapus file pendukung, Anda dapat menggunakan metode berikut:
Hati-hati karena mungkin sangat lambat (tergantung pada berapa banyak objek dalam grafik objek Anda).
sumber
Jika Anda ingin pergi menghapus rute semua objek (yang jauh lebih sederhana daripada menghancurkan tumpukan Data Core, tetapi lebih sedikit performan), daripada ini adalah implementasi yang lebih baik:
Implementasi ini memanfaatkan
NSOperation
untuk melakukan penghapusan dari utas utama dan memberi tahu setelah selesai. Anda mungkin ingin memancarkan pemberitahuan atau sesuatu dalam blok penyelesaian untuk menggelembungkan status kembali ke utas utama.sumber
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
untuk menggunakan metode ini atau Anda akan mendapatkan kesalahan:Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.
Solusi iOS 10 + Swift 3:
Iterasi melalui semua entitas data inti dan bersihkan mereka
sumber
Terima kasih untuk kirimannya. Saya mengikutinya dan itu berhasil untuk saya. Tapi saya punya masalah lain yang tidak disebutkan dalam balasan. Jadi saya tidak yakin apakah itu hanya saya.
Ngomong-ngomong, saya pikir saya akan memposting masalah di sini dan cara saya menyelesaikannya.
Saya punya beberapa catatan di database, saya ingin membersihkan semuanya bersih sebelum menulis data baru ke db, jadi saya melakukan semuanya termasuk
dan kemudian digunakan
managedObjectContext
untuk mengakses database (seharusnya sudah kosong sekarang), entah bagaimana datanya masih ada. Setelah beberapa saat pemecahan masalah, saya menemukan bahwa saya harus mengatur ulangmanagedObjectContext
,managedObject
,managedObjectModel
danpersistentStoreCoordinator
, sebelum saya menggunakanmanagedObjectContext
untuk mengakses dabase tersebut. Sekarang saya memiliki database yang bersih untuk menulis.sumber
Ini adalah versi yang agak disederhanakan dengan lebih sedikit panggilan ke AppDelegate sendiri dan sedikit kode terakhir yang ditinggalkan dari jawaban berperingkat teratas. Juga saya mendapatkan kesalahan "Toko gigih objek tidak dapat dijangkau dari koordinator NSManagedObjectContext ini" jadi hanya perlu menambahkan itu kembali.
sumber
solusi cepat:
sumber
let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "momd")!
Sebagai referensi cepat untuk menyimpan pencarian di tempat lain - membuat ulang toko persistent setelah menghapusnya dapat dilakukan dengan:
sumber
Beberapa jawaban bagus untuk pertanyaan ini. Inilah yang ringkas dan bagus. Dua baris pertama menghapus database sqlite. Kemudian loop for: menghapus semua objek dalam memori managedObjectContext.
sumber
Anda juga dapat menemukan semua nama entitas, dan menghapusnya dengan nama. Ini versi yang lebih lama tetapi berfungsi dengan baik, dengan begitu Anda tidak harus bekerja dengan toko kegigihan
untuk "Any_Entity_Name" berikan saja salah satu dari nama entitas Anda, kami hanya perlu mengetahui deskripsi entitas yang ada di dalam entitas Anda. ValueForKey @ "name" akan mengembalikan semua nama entitas. Akhirnya, jangan lupa untuk menabung.
sumber
Jawaban yang diterima benar dengan menghapus URL oleh NSFileManager benar, tetapi sebagaimana dinyatakan dalam iOS 5+ edit, toko persisten tidak hanya diwakili oleh satu file. Untuk toko SQLite itu * .sqlite, * .sqlite-shm dan * .sqlite-wal ... untungnya karena iOS 7+ kita bisa menggunakan metode
[NSPersistentStoreCoordinator + hapusUbiquitousContentAndPersistentStoreAtURL: options: error:]
untuk mengurus penghapusan, jadi kodenya harus seperti ini:
sumber
Berikut adalah versi yang menghapus setiap catatan di setiap tabel yang Anda miliki.
Cepat 4
sumber
Swift 4/5, iOS 9+
Membangun kembali seluruh
CoreData
file SQLite akan memastikan semua data terhapus, oleh karena itu semua entitas dihapus. Panggil sajadeleteAndRebuild()
.sumber
Bekerja dengan semua versi. Lulus nama entitas dan ulangi untuk menghapus semua entri dan menyimpan konteks.
sumber
Satu metode lain (terlepas dari permintaan penghapusan batch) yang sering saya gunakan (berdasarkan persyaratan aplikasi) adalah untuk mereset toko persisten. Implementasinya terlihat seperti ini untuk iOS 10+ dan Swift (dengan asumsi Anda memiliki kelas CoreDataManager):
Satu keuntungan dari metode ini adalah lebih mudah terutama ketika Anda memiliki banyak catatan data untuk banyak entitas dalam data inti Anda. Dalam hal ini permintaan batch yang dihapus akan memakan banyak memori.
sumber
Solusi Swift 5.1
sumber
Hapus file toko terus-menerus dan siapkan koordinator toko tetap baru?
sumber
Hapus sqlite dari fileURLPath Anda dan kemudian buat.
sumber
Dengan asumsi Anda menggunakan
MagicalRecord
dan memiliki toko persistensi default:Saya tidak suka semua solusi yang menganggap file tertentu ada dan / atau permintaan memasukkan nama entitas atau kelas. Ini adalah Swift (2), cara aman untuk menghapus semua data dari semua entitas. Setelah menghapus itu akan membuat ulang tumpukan baru juga (saya sebenarnya tidak yakin bagaimana perlunya bagian ini).
Ini godo untuk situasi gaya "logout" ketika Anda ingin menghapus semuanya tetapi memiliki toko yang berfungsi dan moc untuk mendapatkan data baru (setelah pengguna login ...)
sumber
Gunakan ini
sumber
Saya mengambil kode Grouchal dan untuk mempercepatnya saya menggunakan enumerasi dengan mode bersamaan (
NSEnumerationConcurrent
), itu menjadi sedikit lebih cepat dibandingkan dengan untuk loop (di aplikasi saya, saya menambahkan fitur ini untuk Penguji sehingga mereka dapat menghapus data dan melakukan testcases daripada menghapus dan instal aplikasi)sumber
di sini versi swift3 saya untuk menghapus semua catatan. 'Pengguna' adalah nama entitas
sumber