ดังนั้นบางทีคำอธิบายทีละขั้นตอนอาจดีที่สุด...?
ฉันพบความสับสนเมื่อเรียนรู้เกี่ยวกับโมเดลข้อมูล ดังนั้นฉันจึงนำเสนอแนวคิดของตัวเองเกี่ยวกับปัญหาที่ฉันพบในระหว่างการศึกษา 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