Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Core Data
Code

Core Data dan Swift: Migrasi

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Core Data and Swift.
Core Data and Swift: More NSFetchedResultsController
Core Data and Swift: Subclassing NSManagedObject

Indonesian (Bahasa Indonesia) translation by Andy Nur (you can also view the original English article)

Pada artikel sebelumnya dari seri ini, kita mengalami masalah yang mengganggu yang perlu kita atasi. Setiap kali kita memodifikasi model data dari aplikasi Core Data, penyimpanan persisten menjadi tidak kompatibel dengan model data. Hasilnya adalah terjadi crash saat peluncuran, rendering aplikasi tidak dapat digunakan, masalah serius jika ini terjadi pada aplikasi di App Store.

Aplikasi kita crash karena kita meminta abort jika menambahkan penyimpanan persisten ke koordinator penyimpanan persisten tidak berhasil. Agar jelas, fungsi abort menyebabkan aplikasi untuk mengakhiri dengan segera.

Namun, tidak perlu menghentikan aplikasi kita, apalagi menjadikannya crash. Jika Core Data memberi tahu kita model data dan penyimpanan persisten yang tidak kompatibel, maka terserah kepada kita untuk menyelesaikannya.

Pada artikel ini, kita akan membahas dua opsi untuk memulihkan dari situasi seperti itu, memigrasikan penyimpanan persisten dan membuat penyimpanan persisten baru yang kompatibel dengan model data yang dimodifikasi.

1. Masalah

biarkan saya terlebih dulu mengklarifikasi masalah yang kita coba pecahkan. Unduh contoh proyek yang kita buat di artikel sebelumnya dan jalankan di simulator. Aplikasi semestinya berjalan dan berfungsi dengan baik.

Buka Done.xcdatamodeld dan tambahkan atribut updatedAt dari tipe Date ke entity Item. Jalankan aplikasi sekali lagi dan perhatikan bagaimana aplikasi crash segera setelah aplikasi diluncurkan. Untungnya, Core Data memberi kita petunjuk tentang apa yang salah. Lihatlah output di konsol Xcode.

Menjelang akhir, Core Data memberi tahu kita bahwa model data yang digunakan untuk membuka penyimpanan persisten tidak kompatibel dengan model data yang digunakan untuk membuat penyimpanan persisten. Tunggu. Apa?

Ketika kita meluncurkan aplikasi untuk pertama kalinya, Core Data membuat database SQLite berdasarkan pada model data. Namun, karena kita mengubah model data dengan menambahkan atribut ke entitas Item, updatedAt, Core Data tidak lagi memahami bagaimana seharusnya menyimpan data Item dalam database SQLite. Dengan kata lain, model data yang dimodifikasi tidak lagi kompatibel dengan penyimpanan persisten, database SQLite, dibuat sebelumnya.

2. Solusi

Untungnya bagi kita, beberapa engineer cerdas di Apple telah menciptakan solusi untuk memodifikasi model data dengan aman tanpa mengalami masalah kompatibilitas. Untuk mengatasi masalah yang kita hadapi, kita perlu menemukan cara untuk memberi tahu Core Data bagaimana satu versi model data berhubungan dengan versi lain. Itu benar, versi model data adalah bagian dari solusi.

Dengan informasi tersebut, Core Data dapat memahami bagaimana penyimpanan persisten perlu diperbarui agar kompatibel dengan model data yang dimodifikasi, yaitu versi baru dari model data. Dengan kata lain, kita perlu menyerahkan informasi Core Data yang diperlukan untuk memigrasikan penyimpanan persisten dari satu versi model data ke model lainnya.

3. Migrasi

Ada dua jenis migrasi, migrasi ringan dan berat. Kata-kata lightweight (ringan) dan heavy (berat) cukup deskriptif, tetapi penting bagi kamu untuk memahami bagaimana Core Data menangani setiap jenis migrasi.

Migrasi Ringan

Migrasi ringan membutuhkan kinerja yang sangat sedikit dari pihakmu, pengembang. Saya sangat menyarankanmu memilih migrasi ringan di atas migrasi berat kapan pun kamu bisa. Biaya migrasi ringan secara substansial lebih rendah daripada migrasi berat.

Tentu saja, sisi lain dari migrasi ringan adalah bahwa mereka kurang tangguh daripada migrasi berat. Perubahan yang dapat kamu buat ke model data dengan migrasi ringan terbatas. Misalnya, migrasi ringan memungkinkanmu menambahkan atau mengganti nama atribut dan entitas, tetapi kamu tidak dapat mengubah tipe atribut atau relasi antara entitas yang ada.

Migrasi ringan ideal untuk memperluas model data, menambahkan atribut dan entitas. Jika kamu berencana untuk memodifikasi relasi atau mengubah jenis atribut, maka kamu berada dalam perjalanan liar dengan migrasi berat.

Migrasi Berat

Migrasi berat agak sedikit rumit. Biarkan saya ulang kata-kata itu. Migrasi berat adalah rasa sakit di leher dan kamu harus mencoba menghindarinya jika memungkinkan. Migrasi berat sangat tangguh, tetapi ketangguhan itu datang dengan biaya. Migrasi berat membutuhkan banyak pekerjaan dan pengetesan untuk memastikan migrasinya selesai dengan sukses dan, yang lebih penting, tanpa kehilangan data.

Kami memasuki dunia migrasi berat jika kita membuat perubahan yang tidak dapat secara otomatis diambil oleh Core Data kita dengan membandingkan versi model data. Core Data kemudian akan membutuhkan model pemetaan untuk memahami bagaimana versi model data berhubungan satu sama lain. Karena migrasi berat adalah topik yang rumit, kita tidak akan membahasnya dalam seri ini.

4. Versi

Jika kamu telah bekerja dengan Ruby on Rails atau framework lain yang mendukung migrasi, maka migrasi Core Data akan sangat masuk akal bagimu. Idenya sederhana namun tangguh. Core Data memungkinkan kita untuk membuat versi model data dan ini memungkinkan kita untuk memodifikasi model data dengan aman. Core Data memeriksa model data yang berversi untuk memahami bagaimana penyimpanan persisten terkait dengan model data. Dengan melihat model data yang berversi, ia juga tahu jika penyimpanan persisten perlu dimigrasikan sebelum dapat digunakan dengan versi model data saat ini.

Versi dan migrasi berjalan beriringan. Jika kamu ingin memahami cara kerja migrasi, pertama-tama kamu harus memahami cara membuat versi model data Core Data. Mari kita kembali ke aplikasi to-do yang kita buat di artikel sebelumnya. Seperti yang kita lihat sebelumnya, menambahkan atribut, updatedAt, ke hasil entity Item di penyimpanan persisten menjadi tidak kompatibel dengan model data yang dimodifikasi. Kita sekarang mengerti penyebabnya.

Mari kita mulai dengan yang bersih dengan membuka Done.xcdatamodeld dan menghapus atribut updatedAt dari entitas Item. Saatnya untuk membuat versi baru dari model data.

Dengan model data yang dipilih, pilih Add Model Version... dari menu Editor. Xcode akan memintamu untuk memberi nama versi model data baru dan, yang lebih penting, pada versi mana versi baru harus didasarkan. Untuk memastikan Core Data dapat memigrasikan penyimpanan persisten bagi kita, penting bahwa kamu memilih versi model data sebelumnya. Dalam contoh ini, kita hanya memiliki satu pilihan.

Adding a Model Version

Hasil dari tindakan ini adalah kita sekarang dapat melihat tiga file model data di Project Navigator. Ada satu model data tingkat atas dengan ekstensi .xcdatamodeld dan dua turunan dengan ekstensi .xcdatamodel.

Data Model Versions

Kamu dapat melihat file .xcdatamodeld sebagai paket untuk versi model data, dengan setiap versi yang diwakili oleh file .xcdatamodel. Kamu dapat memverifikasi ini dengan mengklik kanan file .xcdatamodeld dan memilih Show in Finder. Ini akan membawamu ke model data dalam proyek Xcode. Kamu seharusnya melihat dua versi dari model data, Done.xcdatamodel dan Done 2.xcdatamodel.

Pernahkah kamu memperhatikan di Project Navigator bahwa salah satu versinya memiliki tanda centang hijau? Tanda centang ini menunjukkan apa versi model saat ini, Done.xcdatamodel dalam contoh ini. Dengan kata lain, meskipun kits telah membuat versi baru dari model data, itu belum dimanfaatkan oleh aplikasi kita. Sebelum kita mengubah ini, kita perlu memberitahu Core Data apa yang harus dilakukan dengan model data berversi.

Kita perlu memberi tahu Core Data cara memigrasikan penyimpanan persisten untuk model data. Kita melakukan ini ketika kita menambahkan penyimpanan yang persisten ke koordinator penyimpanan persisten di AppDelegate.swift. Dalam implementasi properti persistentStoreCoordinator, kita membuat koordinator penyimpanan persisten dan menambahkan penyimpanan yang tetap padanya dengan menerapkan addPersistentStoreWithType(_:configuration:URL:option:). Ini seharusnya sudah terbiasa sekarang.

Parameter keempat dari metode ini adalah kamus opsi, yang saat ini nil. Kamus opsi ini termasuk instruksi untuk Core Data. Ini memberi kita kesempatan untuk memberi tahu koordinator penyimpanan persisten bagaimana seharusnya memigrasi penyimpanan persisten yang ingin kita tambahkan ke dalamnya.

Lihatlah cuplikan kode berikut di mana kita meneruskan kamus opsi dengan dua pasangan nilai kunci.

Kunci pertama, NSMigratePersistentStoresAutomaticallyOption, memberi tahu Core Data bahwa kita ingin mencoba memigrasikan penyimpanan persisten untuk kita. Kunci kedua, NSInferMappingModelAutomaticallyOption, instruksikan Core Data untuk menyimpulkan model pemetaan untuk migrasi. Inilah yang kita inginkan. Ini seharusnya bekerja tanpa masalah selama kita berurusan dengan migrasi ringan.

Dengan perubahan ini, kita siap memigrasikan model data ke versi baru yang kita buat beberapa saat yang lalu. Mulai dengan memilih versi baru, Done 2.xcdatamodel, dan tambahkan suatu atribut baru UpdateAt dengan tipe Date ke entitas Item.

Kita juga perlu menandai versi model data baru sebagai versi yang akan digunakan oleh Core Data. Pilih Done.xcdatamodeld di Project Navigator dan buka File Inspector di sebelah kanan. Di bagian Model Version, atur Current ke Done 2.

Updating the Model Version

Di Project Navigator, Done 2.xcdatamodel sekarang seharusnya memiliki tanda centang hijau, bukan Done.xcdatamodel.

Versioning the Data Model

Dengan perubahan ini, kamu dapat membuat dan menjalankan aplikasi dengan aman. Jika kamu telah mengikuti langkah-langkah di atas, Core Data secara otomatis akan memigrasikan penyimpanan persisten untukmu dengan menyimpulkan model pemetaan berdasarkan model data berversi.

Perhatikan bahwa ada beberapa peringatan yang harus kamu ketahui. Jika kamu mengalami crash, maka kamu telah melakukan kesalahan. Sebagai contoh, jika kamu telah mengatur versi model data ke Done 2.xcdatamodel, jalankan aplikasi, dan kemudian lakukan perubahan pada Done 2.xcdatamodel, maka kemungkinan besar kamu akan mengalami crash karena penyimpananpersisten tidak kompatibel dengan model data. Migrasi ringan relatif kuat dan mudah diterapkan, tetapi itu tidak berarti kamu dapat memodifikasi model data kapan saja.

Lapisan data proyek perangkat lunak membutuhkan perawatan, perhatian, dan persiapan. Migrasi besar, tetapi mereka harus digunakan secukupnya. Crash tidak masalah selama pengembangan, tetapi merupakan bencana besar dalam produksi. Di bagian selanjutnya, kita melihat lebih dekat apa artinya ini dan bagaimana mencegah crash karena migrasi yang bermasalah.

5. Menghindari Crash

Saya tidak pernah mendapati situasi yang mengharuskan pemanggilan abort dalam produksi dan itu menyakitkan saya ketika saya menelusuri proyek di mana implementasi standar Apple untuk menyiapkan tumpukan Core Data yang digunakan, di mana abort dipanggil ketika menambahkan penyimpanan persisten tidak berhasil.

Menghindari abort tidak terlalu sulit, tetapi memerlukan beberapa baris kode dan memberi tahu pengguna tentang apa yang salah jika terjadi sesuatu yang salah. Pengembang hanya manusia dan kita semua membuat kesalahan, tetapi itu tidak berarti kamu harus menyerah dan memanggil abort.

Langkah 1: Mendapatkan Rid Abort

Mulailah dengan membuka AppDelegate.swift dan hapus baris yang kita panggil abort. Itu langkah pertama untuk pengguna yang bahagia.

Langkah 2: Memindahkan Penyimpanan Yang Tidak Kompatibel

Jika Core Data mendeteksi bahwa penyimpanan persisten tidak kompatibel dengan model data, pertama-tama kita memindahkan penyimpanan yang tidak kompatibel ke lokasi yang aman. Kita melakukan ini untuk memastikan data pengguna tidak hilang. Bahkan jika model data tidak kompatibel dengan penyimpanan persisten, kamu mungkin dapat memulihkan form data. Lihatlah implementasi terbaru dari properti persistentStoreCoordinator di AppDelegate.swift.

Perhatikan bahwa saya telah mengubah nilai URLPersistentStore, lokasi penyimpanan persisten. Ini menunjuk ke direktori di direktori Document di kotak pasir aplikasi. Implementasi applicationStoresDirectory(), metode helper, sangat mudah seperti yang kamu lihat di bawah ini. Ini tentu lebih verbose daripada di Objective-C. Juga perhatikan bahwa saya memaksa membukanya hasil path() dari konstanta URL, karena kita dapat berasumsi bahwa ada direktori dukungan aplikasi di kotak pasir aplikasi, baik di iOS dan di OS X.

Jika koordinator penyimpanan persisten tidak dapat menambahkan penyimpanan persisten yang ada di URLPersistentStore, kita memindahkan penyimpanan persisten ke direktori terpisah. Untuk melakukan itu, kita menggunakan dua metode helper lagi, applicationIncompatibleStoresDirectory() dan nameForIncompatibleStore(). Implementasi applicationIncompatibleStoresDirectory() ini mirip dengan applicationStoresDirectory().

Di nameForIncompatibleStore(), kita menghasilkan nama untuk penyimpanan yang tidak kompatibel berdasarkan tanggal dan waktu saat ini untuk menghindari bentrokan penamaan.

Langkah 3: Membuat Penyimpanan Persisten Baru

Saatnya membuat penyimpanan persisten baru untuk menyelesaikan penyiapan tumpukan Core Data. Beberapa baris selanjutnya akan terlihat sangat akrab sekarang.

Jika Core Data tidak dapat membuat penyimpanan persisten baru, maka ada masalah yang lebih serius yang tidak terkait dengan model data yang tidak kompatibel dengan penyimpanan persisten. Jika kau mengalami masalah ini, periksa kembali nilai URLPersistentStore.

Langkah 4: Memberitahu Pengguna

Langkah ini mungkin yang paling penting dalam hal menciptakan aplikasi yang ramah pengguna. Kehilangan data pengguna adalah satu hal, tetapi berpura-pura bahwa tidak ada yang terjadi itu tidak baik. Bagaimana perasaanmu jika sebuah maskapai penerbangan kehilangan bagasimu, berpura-pura seolah-olah tidak ada yang terjadi.

Jika Core Data tidak dapat memigrasikan penyimpanan persisten menggunakan model data, kita mengingat ini dengan menetapkan pasangan key-value dalam basis data default pengguna aplikasi. Kami mencari pasangan key-valu ini dalam metode viewDidLoad() pada class ViewController.

Implementasi showAlertWithTitle(_:message:cancelButtonTitle:) mirip dengan yang telah kita lihat di AddToDoViewController. Perhatikan bahwa kita menghapus pasangan key-value ketika pengguna mengetuk tombol peringatan.

Kita menunjukkan peringatan kepada pengguna, tetapi ada baiknya untuk mengambil beberapa langkah lebih jauh. Misalnya, kamu dapat mendesak mereka untuk menghubungi dukungan dan kamu bahkan dapat menerapkan fitur yang memungkinkannya mengirimimu penyimpanan yang korup. Yang terakhir ini sangat berguna untuk mengatasi masalah ini.

Langkah 5: Melakukan Test

Data persisten merupakan aspek penting dari sebagian besar aplikasi. Karena itu penting untuk menguji benar apa yang kita telah menerapkan dalam artikel ini. Untuk menguji strategi pemulihan kita, jalankan aplikasi di simulator dan periksa kembali apakah penyimpanan yang gigih berhasil dibuat di direktori Application Support, di subdirektori Stores.

Tambahkan atribut baru ke entitas Item di Done 2.xcdatamodel dan jalankan aplikasinya sekali lagi. Karena penyimpanan persisten yang ada sekarang tidak kompatibel dengan model data, penyimpanan persisten yang tidak kompatibel dipindahkan ke subdirektori Incompatible dan penyimpanan persisten yang baru dibuat. Kamu juga harus melihat peringatan, memberi tahu pengguna tentang masalah tersebut.

Informing The User

Kesimpulan

Migrasi adalah topik penting jika kamu berencana untuk menggunakan Core Data secara luas. Migrasi memungkinkanmu memodifikasi model data aplikasi dengan aman dan, dalam kasus migrasi ringan, tanpa banyak biaya tambahan.

Di artikel berikutnya, kita akan fokus pada subclassing NSManagedObject. Jika proyek Core Data memiliki kompleksitas, maka subclassing NSManagedObject adalah cara yang tepat.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.