CoreData + SwiftUI
Di sini Anda dapat melihat artikel aslinya
Baru-baru ini saya harus membuat aplikasi menggunakan SwiftUI dan CoreData .
Saya pikir CoreData digunakan hampir seperti yang Anda gunakan dengan UIKit, tetapi ternyata ada beberapa perbedaan.
Panduan ini dimaksudkan sebagai rangkuman pengalaman saya menggunakan CoreData yang dikombinasikan dengan SwiftUI. Jika saya menemukan aspek lain, saya akan menambahkannya ke panduan ini.
Jadi, tanpa basa-basi lagi, mari kita mulai.
Mempersiapkan
Ini adalah bagian yang cukup mudah.
- Jika Anda memulai proyek baru, Anda dapat mencentang opsi ' Gunakan Data Inti ' dan ' Host di CloudKit ' jika Anda ingin menyimpan data pengguna Anda ke cloud. Dalam hal ini XCode akan mengatur proyek untuk Anda. (Untuk bagian CloudKit perlu melakukan beberapa langkah tambahan).
- Jika Anda sudah memiliki proyek, Anda harus membuat file Persistence.swift dan file swift tempat Anda menginisialisasi tumpukan CoreData. (Anda bahkan dapat membuat proyek baru mengikuti langkah sebelumnya, dan menyalin file Persistence.swift yang dibuat oleh XCode ke proyek Anda.
Sekarang setelah Anda memiliki proyek Anda, untuk dapat menggunakan CoreData dalam Tampilan Anda, Anda harus meneruskan managedObjectContexthierarki tampilan Anda ke bawah.
Biasanya ini dilakukan di file [nama aplikasi] App.swift Anda .
PersistenceController ( berikut contohnya ) adalah struct yang dihasilkan XCode secara otomatis untuk Anda saat Anda memulai proyek baru dengan mencentang opsi 'Use Core Data'.
@main
struct ExampleApp: App {
let persistenceController = PersistenceController.shared
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(persistenceController)
.environment(\.managedObjectContext, persistenceController.container.viewContext)
}
}
}
Hebat, sekarang Anda dapat membuat, membaca, memperbarui, dan menghapus NSManagedObjects di tampilan Anda.
Beroperasi dengan CoreData
Untuk beroperasi dengan CoreData, Anda perlu mengakses NSManagedObjectContext . Untuk melakukannya, Anda memiliki dua opsi:
- Menggunakan pembungkus @ Lingkungan dalam tampilan Anda
@Environment(\.managedObjectContext) private var viewContext
@EnvironmentObject private var persistenceController: PersistenceController
do {
if container.viewContext.hasChanges {
try container.viewContext.save()
}
} catch {
print(error)
}
Untuk menyimpan NSManagedObject, Anda harus terlebih dahulu menginisiasinya dan kemudian mengonfigurasi propertinya. Dan kemudian simpan konteksnya.
let note = Note(context: container.viewContext)
note.id = id
note.text = text
note.folder = folder
note.creationDate = Date()
saveContext()
Mengambil objek
Sekarang bagian pengambilan, di sinilah saya menemukan kesulitan paling banyak. Mari kita mulai sekarang juga.
Untuk mengambil objek di SwiftUI, cara paling nyaman untuk melakukannya adalah menggunakan pembungkus @FetchRequest atau @SectionedFetchRequest , di setiap Tampilan yang perlu Anda baca dari CoreData.
Melewati objek yang diambil di antara Tampilan akan merusak pembaruan otomatis jika Anda menambah, mengedit, atau menghapus objek. (Jika Anda tahu cara meneruskan objek pengambilan tanpa merusak pembaruan, beri tahu saya dan saya akan memperbarui panduan ini)
Jadi, Anda perlu menambahkan @FetchRequest di setiap tampilan yang Anda perlukan objek CoreData dan pembaruan otomatis. Saya tahu ini agak mengganggu tetapi itu akan sia-sia.
Jadi, dengan itu kodenya adalah sebagai berikut:
@FetchRequest(entity: \Object.type,
sortDescriptors: [NSSortDescriptor],
predicate: NSPredicate,
animation: .default)
var objects: [Object]
@SectionedFetchRequest(entity: \Object.type,
sectionIdentifier: \Object.property,
sortDescriptors: [NSSortDescriptor],
predicate: NSPredicate,
animation: .default)
var sections: SectionedFetchResults<YourSectionType, Object>
List(sections) { section in
Section(section.id) {
ForEach(section) { object in
// Configure your view with the object
}
}
}
Menggunakan @FetchRequest atau @SectionedFetchRequest di mana pun Anda menambahkan, memperbarui, atau menghapus objek, tampilan diperbarui secara otomatis.
Sekarang, jika Anda perlu menggunakan @FetchRequest dengan NSPredicate yang memiliki parameter yang diteruskan dari Tampilan induk, saya menemukan bahwa opsi selanjutnya berfungsi dengan sangat baik.
@FetchRequest
var objects: FetchedResults<Object>
init(id: ID) {
_objects = FetchRequest<Object>(predicate: NSPredicate(format: "id == %@", id))
}
Memperbarui objek
Untuk memperbarui, NSManagedObjectAnda harus memiliki NSManagedObjectto update, diambil seperti yang dijelaskan sebelumnya dan memperbarui propertinya. Dan kemudian simpan konteksnya.
note.text = newText
note.folder = newFolder
saveContext()
Untuk menghapus NSManagedObjectAnda harus memiliki NSManagedObjectuntuk memperbarui, diambil seperti yang dijelaskan sebelumnya dan menghapusnya.
viewContext.delete(object)
Kesimpulan
Itu saja yang saya temukan sejauh ini tentang CoreData yang digunakan dengan SwiftUI. Panduan ini akan terus diperbarui.
Jika Anda ingin menyarankan cara yang lebih baik dalam melakukan sesuatu, tinggalkan komentar dan saya akan memperbarui panduan ini dengan opsi terbaik.
Saya harap saya membantu Anda dalam perjalanan Anda dengan pengembangan SwiftUI dan iOS.
TINGGALKAN CLAP jika Anda menyukai artikel ini, saya sangat menghargainya.
Sampai jumpa di panduan berikutnya!
Jika Anda ingin mendukung pekerjaan saya dan melihat panduan ini beraksi, lihat BrainDump — Notes & Writing .
Terima kasih

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































