ข้อมูลหลัก - การโยกย้ายแบบน้ำหนักเบาและโมเดลข้อมูลหลักหลายรายการ

แอปที่ฉันส่งมามีโมเดล coredata สองโมเดล และฉันได้ทำการเปลี่ยนแปลงบางอย่างกับโมเดลโดยการเพิ่มคุณลักษณะบางอย่างให้กับโมเดลปัจจุบัน ดังนั้นฉันจึงเพิ่มเวอร์ชันใหม่ให้กับโมเดลและเปิดใช้งานการโยกย้ายแบบไลท์เวท แต่ข้อผิดพลาดนี้ปรากฏขึ้นเมื่อทำการโยกย้าย reason = "Can't find model for source store"

ฉันติดตามคำตอบที่สองสำหรับคำถามนี้ [ข้อมูลหลัก - การโยกย้ายแบบมีน้ำหนักเบาและไฟล์โมเดลข้อมูลหลักหลายไฟล์ (xcdatamodel) ][2] และใช้งานได้ดีกับเครื่องจำลอง แต่ใช้งานไม่ได้กับอุปกรณ์และทำให้เกิดข้อผิดพลาดเดียวกัน

เนวิเกเตอร์ scrrenshot


person Mustafa Ibrahim    schedule 19.05.2014    source แหล่งที่มา
comment
คุณมีโมเดลข้อมูลที่แยกกันสองโมเดล หรือคุณมีโมเดลข้อมูลเดียวกันสองเวอร์ชัน แม้ว่าโมเดลข้อมูลรุ่นหลังจะได้รับการแก้ไขเล็กน้อยก็ตาม   -  person andrewbuilder    schedule 19.05.2014
comment
ไม่มีแบบจำลองข้อมูลแยกกันสองแบบ   -  person Mustafa Ibrahim    schedule 19.05.2014
comment
แต่ตอนนี้มีแบบจำลองข้อมูลหนึ่งตัวที่พิจารณาคำตอบที่ฉันแนบมาในคำถาม   -  person Mustafa Ibrahim    schedule 19.05.2014
comment
คุณช่วยกรุณาจับภาพหน้าจอของพื้นที่ของ Project Navigator ของคุณใน Xcode เพื่อให้แน่ใจว่าภาพหน้าจอนั้นรวมคอนเทนเนอร์ .xcdatamodeld และเวอร์ชันใดๆ ไว้ด้วย ปิดบังชื่อของโมเดลหากจำเป็น แต่ต้องแน่ใจว่ามองเห็นส่วนขยายพาธแต่ละอันได้ชัดเจน   -  person andrewbuilder    schedule 19.05.2014
comment
@andrewbuilder กรุณาตรวจสอบภาพหน้าจอ   -  person Mustafa Ibrahim    schedule 19.05.2014
comment
ขอบคุณ @Mustafa - เพียงแค่แยกแยะข้อผิดพลาดทั่วไปออก   -  person andrewbuilder    schedule 19.05.2014
comment
ให้เราสนทนาต่อในการแชท   -  person andrewbuilder    schedule 19.05.2014


คำตอบ (1)


ดังนั้นบางทีคำอธิบายทีละขั้นตอนอาจดีที่สุด...?

ฉันพบความสับสนเมื่อเรียนรู้เกี่ยวกับโมเดลข้อมูล ดังนั้นฉันจึงนำเสนอแนวคิดของตัวเองเกี่ยวกับปัญหาที่ฉันพบในระหว่างการศึกษา Core Data ส่วนนี้... (ซึ่งก็คือ เพิ่งเริ่มต้นจริงๆ ในรูปแบบโดยรวมเท่านั้น ของสิ่งที่).

ฉันไม่สามารถเน้นย้ำถึงความสำคัญของการอ่านหนังสือดีๆ สักเล่มและพัฒนาวิธีแก้ปัญหาตามคำแนะนำที่มีอยู่ภายในได้มากพอ ดังนั้นในใจ...

หนังสือที่ฉันมักจะแนะนำสำหรับผู้ที่สนใจ Core Data นั้นมาจาก The Pragmatic Bookshelf – "Core Data, 2nd Edition, Data Storage and Management for iOS, OS X และ iCloud" (มกราคม 2013) โดย Marcus S. Zarra และใน บทที่ 3 โดยเฉพาะหัวข้อ "เวอร์ชันและการย้ายข้อมูล"

สิ่งสำคัญคือต้องรับรู้ว่าหากต้องการย้ายข้อมูลให้สำเร็จ ข้อมูลหลักต้องใช้โมเดลข้อมูล เวอร์ชันก่อนหน้าทั้งหมดที่สมบูรณ์และสมบูรณ์ซึ่งไม่มีการแก้ไข

ทำไม

ตัวอย่าง...

  • ผู้ใช้1 จะอัปเดตทุกครั้งที่มีการเปิดตัวแอปเวอร์ชันใหม่ อย่างไรก็ตาม ในการอัปเดตล่าสุด จะมีความสัมพันธ์กับเวอร์ชันโมเดลข้อมูลที่เก่าที่สุดเป็นอันดับสาม
  • ผู้ใช้ 2 ไม่ได้อัปเดตแอปเป็นเวลาสี่เดือน - App Store สามรุ่น / เวอร์ชันที่แล้วซึ่งมีความสัมพันธ์กับเวอร์ชันโมเดลข้อมูลที่เก่าแก่ที่สุดอันดับที่เจ็ด
  • ผู้ใช้ 3 ใช้โทรศัพท์ Android ตระหนักถึงข้อผิดพลาดของวิธีการของเขา และกลับมาที่ iPhone 4 ของเขาโดยติดตั้งแอปของคุณไว้ แต่ไม่ได้รับการอัปเดตเป็นเวลาหนึ่งปี ซึ่งสัมพันธ์กับเวอร์ชันโมเดลข้อมูลที่เก่าแก่ที่สุดที่สิบเก้า เมื่อแอปใช้ข้อมูลที่แตกต่างกันสองรายการ ตู้คอนเทนเนอร์จำลอง

Core Data อย่างไร ที่จะทราบวิธีย้ายฐานข้อมูล SQLite ของแอปก่อนหน้าไปเป็นเวอร์ชันปัจจุบัน เพื่อให้ฐานข้อมูลทำงานกับโค้ดในแอปของคุณได้

(ตอนนี้ฉันไม่เข้าใจสิ่งนี้ทั้งหมด ดังนั้นโปรดยกโทษให้ฉันด้วย แต่) ความเข้าใจของฉันคือ Core Data ใช้ค่าที่ลงนามแฮชของโมเดลข้อมูลเวอร์ชันก่อนหน้าของคุณเพื่อระบุว่าโมเดลข้อมูลใดที่แอปของคุณใช้อยู่ในปัจจุบัน และตามนั้น ใช้การย้ายข้อมูลเพื่ออัปเดตโมเดลข้อมูลของคุณ - และนี่คือส่วนสำคัญ - รุ่นข้อมูลหนึ่งรุ่นในแต่ละครั้ง!

นี่เป็นสิ่งสำคัญที่จะเข้าใจ เมื่อคุณเข้าใจสิ่งนี้ แสดงว่าคุณเข้าใจว่าข้อมูลหลักต้องใช้เวอร์ชันโมเดลข้อมูลก่อนหน้า ทั้งหมด เวอร์ชัน ที่ไม่มีการแก้ไข เพื่อย้ายข้อมูลได้สำเร็จ ต้องใช้เวอร์ชันโมเดลข้อมูลก่อนหน้านี้แต่ละเวอร์ชันเพื่อให้แต่ละขั้นตอนในกระบวนการย้ายเสร็จสมบูรณ์

เรามาทบทวนตัวอย่างของฉันกัน

เมื่อพวกเขาดาวน์โหลดการอัปเดตแอป และเรียกใช้แอปเป็นครั้งแรกหลังจากการอัปเดตล่าสุดนี้:

  • แอปเวอร์ชันของผู้ใช้ 1 มีเวอร์ชันโมเดลข้อมูลสามเวอร์ชันที่จะโยกย้ายเพื่อไปยังฐานข้อมูล SQLite ที่สอดคล้องกับโมเดลข้อมูลล่าสุด
  • แอปเวอร์ชันของ user2 มีเวอร์ชันโมเดลข้อมูลเจ็ดเวอร์ชันที่จะโยกย้ายเพื่อไปยังฐานข้อมูล SQLite ที่สอดคล้องกับโมเดลข้อมูลล่าสุด
  • แอปเวอร์ชันของผู้ใช้ 3 มีเวอร์ชันโมเดลข้อมูลสิบเก้าเวอร์ชันที่จะย้าย แต่หากต้องการเพิ่มโมเดลข้อมูลก่อนหน้านี้สองโมเดลจะต้องผสานระหว่างโมเดลข้อมูลเวอร์ชัน 10 และโมเดลข้อมูลเวอร์ชัน 11 (ตัวอย่าง) เพื่อมาถึงฐานข้อมูล SQLite ที่สอดคล้องกับ แบบจำลองข้อมูลล่าสุด

ดังนั้นหากคุณลบหรือแก้ไขคอนเทนเนอร์หรือเวอร์ชันของโมเดลข้อมูลก่อนหน้านี้ ข้อมูลหลักจะทราบวิธีการโยกย้ายได้สำเร็จได้อย่างไร

ด้วยเหตุนี้ ผมจึงมีคำแนะนำดังนี้...

  • เก็บโมเดลข้อมูลและเวอร์ชันก่อนหน้า ทั้งหมด ไว้ในคอนเทนเนอร์ .xcdatamodeld ที่เกี่ยวข้อง
  • ในกรณีที่คุณมีโมเดลข้อมูลมากกว่าหนึ่งโมเดลที่ต้องย้าย ให้เก็บเวอร์ชัน ORIGINAL ของโมเดลข้อมูลเหล่านี้ .xcdatamodeld คอนเทนเนอร์ไว้ และใช้วิธีการ Core Data ที่เหมาะสมเพื่อรวมคอนเทนเนอร์เมื่อจำเป็น

ในการตอบคำถามนี้โดยตรง ฉันสงสัยว่าในบางขั้นตอนคุณได้แก้ไขคอนเทนเนอร์หรือเวอร์ชันของโมเดลข้อมูลก่อนหน้านี้ เพื่อให้เหมาะกับการทดสอบของคุณบนเครื่องจำลอง เมื่อทำการทดสอบบนอุปกรณ์ ค่าที่เซ็นชื่อแฮช "ที่แตกต่างกัน" สำหรับโมเดลข้อมูลบนอุปกรณ์จะไม่ตรงกับสิ่งใดก็ตามที่ยังคงอยู่ในคอนเทนเนอร์เวอร์ชันโมเดลข้อมูลของคุณ และเพื่อให้ Build & Run ส่งข้อผิดพลาดที่คุณระบุไว้ในคำถามของคุณ

คำแนะนำของฉันคือสร้างคอนเทนเนอร์เวอร์ชันโมเดลข้อมูลของคุณใหม่ (.xcdatamodeld ไฟล์) เหมือนเดิม เพื่อให้ Core Data สามารถโยกย้ายผ่านเวอร์ชันก่อนหน้าทั้งหมดได้อย่างเหมาะสม (และรวมคอนเทนเนอร์โมเดลตามความจำเป็น) เพื่อให้ได้ฐานข้อมูล SQLite ที่เหมาะสมและล่าสุด

หวังว่านี่จะช่วยได้

โปรดแจ้งให้เราทราบหากฉันพลาดเป้าหมาย และฉันจะทำการสอบสวนต่อไป

person andrewbuilder    schedule 21.05.2014