Data Inti - migrasi ringan dan beberapa model data inti

Aplikasi yang saya kirimkan memiliki dua model data inti dan saya membuat beberapa perubahan pada model dengan menambahkan beberapa atribut ke model saat ini. jadi saya menambahkan versi baru ke model dan mengaktifkan migrasi ringan tetapi kesalahan ini muncul saat migrasi reason = "Can't find model for source store"

Saya mengikuti jawaban kedua pada pertanyaan ini [Data Inti - migrasi ringan dan beberapa file model data inti (xcdatamodel) ][2] dan berfungsi dengan baik di simulator tetapi tidak berfungsi di perangkat dan memicu kesalahan yang sama.

Navigator scrrenshot


person Mustafa Ibrahim    schedule 19.05.2014    source sumber
comment
Apakah Anda memiliki dua model data terpisah, atau apakah Anda memiliki dua versi model data yang sama, meskipun model data selanjutnya sedikit dimodifikasi?   -  person andrewbuilder    schedule 19.05.2014
comment
tidak ada dua model data yang terpisah.   -  person Mustafa Ibrahim    schedule 19.05.2014
comment
tapi sekarang ada satu model data mengingat jawaban yang saya lampirkan di pertanyaan   -  person Mustafa Ibrahim    schedule 19.05.2014
comment
Bisakah Anda mengambil tangkapan layar area Project Navigator Anda di Xcode - memastikan tangkapan layar menyertakan wadah .xcdatamodeld dan versi apa pun? Hilangkan nama model jika perlu, tetapi pastikan setiap perluasan jalur terlihat jelas.   -  person andrewbuilder    schedule 19.05.2014
comment
@andrewbuilder silakan periksa tangkapan layarnya   -  person Mustafa Ibrahim    schedule 19.05.2014
comment
Terima kasih @Mustafa - hanya mengesampingkan kesalahan umum.   -  person andrewbuilder    schedule 19.05.2014
comment
mari kita melanjutkan diskusi ini di chat   -  person andrewbuilder    schedule 19.05.2014


Jawaban (1)


Jadi mungkin penjelasan langkah demi langkah adalah yang terbaik...?

Saya mengalami kebingungan saat mempelajari model data, jadi saya mempresentasikan ide saya sendiri tentang masalah yang saya temui selama bagian pendidikan Data Inti saya ini... (yang sebenarnya baru saja dimulai dalam skema keseluruhan hal).

Saya sangat menekankan pentingnya membaca beberapa buku bagus dan mengembangkan solusi berdasarkan saran yang terkandung di dalamnya... jadi dengan mengingat hal itu...

Buku yang sering saya rekomendasikan bagi yang tertarik dengan Core Data adalah dari The Pragmatic Bookshelf – "Core Data, 2nd Edition, Data Storage and Management for iOS, OS X, and iCloud" (Jan 2013) oleh Marcus S. Zarra, dan di khususnya Bab 3 berjudul "Versioning dan Migration".

Penting untuk diketahui bahwa agar migrasi berhasil, Data Inti memerlukan SEMUA VERSI ASLI YANG SEBELUMNYA TAK TERUBAH dari model data.

Mengapa?

Sebuah contoh...

  • user1 diperbarui setiap kali versi baru aplikasi dirilis, namun pada pembaruan terkini, hal ini berkorelasi dengan versi model data terlama ketiga.
  • pengguna2 belum memperbarui aplikasi selama empat bulan - tiga rilis/versi App Store yang lalu, yang kebetulan berkorelasi dengan versi model data tertua ketujuh.
  • pengguna3 menggunakan ponsel Android, menyadari kesalahannya, dan kembali ke iPhone 4 miliknya, dengan aplikasi Anda terinstal, tetapi tidak diperbarui selama satu tahun, yang berkorelasi dengan versi model data tertua kesembilan belas, saat aplikasi menggunakan dua data berbeda wadah model.

Jadi bagaimana Core Data mengetahui cara memigrasikan database SQLite aplikasi sebelumnya ke versi saat ini, sehingga database akan berfungsi dengan kode di aplikasi Anda?

(Sekarang saya tidak sepenuhnya memahami hal ini, jadi mohon maafkan ketidaktahuan saya, tetapi) pemahaman saya adalah bahwa Core Data menggunakan nilai hash yang ditandatangani dari versi model data Anda sebelumnya untuk mengidentifikasi model data mana yang saat ini digunakan aplikasi Anda, dan berdasarkan pada itu , menerapkan migrasi untuk memperbarui model data Anda - dan inilah bagian pentingnya - SATU VERSI MODEL DATA SETIAP WAKTU!

Ini penting untuk dipahami. Jika Anda memahami hal ini, Anda memahami bahwa Data Inti memerlukan SEMUA versi model data sebelumnya, tanpa dimodifikasi, agar berhasil dimigrasi. Setiap versi model data sebelumnya diperlukan agar berhasil menyelesaikan setiap langkah dalam proses migrasi.

Mari kita tinjau contoh saya.

Saat mereka mengunduh pembaruan aplikasi, dan menjalankan aplikasi untuk pertama kalinya setelah pembaruan terbaru ini:

  • versi aplikasi pengguna1 memiliki tiga versi model data yang harus dimigrasikan agar sampai pada database SQLite yang selaras dengan model data terbaru.
  • versi aplikasi pengguna2 memiliki tujuh versi model data yang harus dimigrasikan agar sampai pada database SQLite yang selaras dengan model data terbaru.
  • Aplikasi versi pengguna3 memiliki sembilan belas versi model data untuk dimigrasikan, namun untuk menambahkannya, dua model data sebelumnya harus menggabungkan antara model data versi 10 dan model data versi 11 (misalnya), untuk sampai pada database SQLite yang selaras dengan model data terbaru.

Jadi, jika Anda menghapus atau mengubah salah satu penampung atau versi model data sebelumnya, bagaimana Data Inti mengetahui cara migrasi berhasil?

Dengan mengingat hal ini, saya memberikan saran berikut...

  • Simpan SEMUA model dan versi data sebelumnya di .xcdatamodeld penampungnya masing-masing.
  • Jika Anda memiliki lebih dari satu model data yang harus dimigrasi, pertahankan versi ASLI dari penampung model data ini .xcdatamodeld, dan gunakan metode Data Inti yang sesuai untuk menggabungkan penampung bila diperlukan.

Sebagai tanggapan langsung terhadap pertanyaan tersebut, saya menduga bahwa pada tahap tertentu Anda telah memodifikasi wadah atau versi model data sebelumnya, agar sesuai dengan pengujian Anda pada simulator. Saat menguji pada perangkat, nilai hash yang ditandatangani "berbeda" untuk model data pada perangkat tidak cocok dengan apa pun yang tersisa dalam wadah versi model data Anda, sehingga Build & Run memunculkan kesalahan yang Anda catat dalam pertanyaan Anda.

Saran saya adalah membangun kembali wadah versi model data Anda (.xcdatamodeld file) sebagaimana adanya, untuk memungkinkan Data Inti bermigrasi dengan benar melalui semua versi sebelumnya (dan menggabungkan wadah model seperlunya) untuk sampai pada database SQLite yang sesuai dan terbaru.

Semoga ini membantu.

Beri tahu saya jika saya meleset, dan saya akan melanjutkan penyelidikan.

person andrewbuilder    schedule 21.05.2014