การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit
ย้ายการเปลี่ยนแปลงโครงสร้างข้อมูล และเปิดใช้การซิงค์ CloudKit ด้วย NSPersistentCloudKitContainer
การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องย้ายข้อมูล
เมื่อคุณเปลี่ยนโมเดล Core Data หรือ SwiftData เช่น เพิ่ม เปลี่ยนชื่อ หรือลบแอตทริบิวต์ คุณต้องย้ายที่จัดเก็บข้อมูลเดิม
// Without migration, app crashes on launch:
// "The model used to open the store is incompatible with the one used to create the store"การย้ายข้อมูลแบบเบาใน Core Data
Core Data สามารถอนุมานการย้ายข้อมูลอย่างง่าย เช่น การเพิ่ม เปลี่ยนชื่อ หรือลบแอตทริบิวต์ได้โดยอัตโนมัติ โดยไม่ต้องใช้โมเดลการแมป
let desc = NSPersistentStoreDescription(url: storeURL)
desc.shouldMigrateStoreAutomatically = true
desc.shouldInferMappingModelAutomatically = true
container.persistentStoreDescriptions = [desc]ประวัติเวอร์ชันใน .xcdatamodeld
สร้างเวอร์ชันโมเดลใหม่ใน Xcode: ตัวแก้ไข → เพิ่มเวอร์ชันโมเดล จากนั้นกำหนดให้เวอร์ชันใหม่เป็นเวอร์ชันปัจจุบัน
// In MyModel.xcdatamodeld:
// ├── MyModel.xcdatamodel (v1 - old)
// └── MyModel 2.xcdatamodel (v2 - current)
// Set current version to v2 in File Inspectorการกำหนดเวอร์ชันสคีมาใน SwiftData
ใช้ VersionedSchema และ SchemaMigrationPlan เพื่อจัดการเวอร์ชันโมเดลของ SwiftData
enum AppSchemaV1: VersionedSchema {
static var versionIdentifier = Schema.Version(1,0,0)
static var models: [any PersistentModel.Type] { [ItemV1.self] }
@Model final class ItemV1 { var name: String; init(name: String) { self.name = name } }
}SchemaMigrationPlan
กำหนดขั้นตอนการย้ายข้อมูลระหว่างเวอร์ชันใน SchemaMigrationPlan เพื่อแนะนำ SwiftData ระหว่างการอัปเกรด
enum AppMigrationPlan: SchemaMigrationPlan {
static var schemas: [any VersionedSchema.Type] { [AppSchemaV1.self, AppSchemaV2.self] }
static var stages: [MigrationStage] { [migrateV1toV2] }
static let migrateV1toV2 = MigrationStage.lightweight(fromVersion: AppSchemaV1.self, toVersion: AppSchemaV2.self)
}ขั้นตอนการย้ายข้อมูลแบบกำหนดเอง
สำหรับการย้ายข้อมูลที่ซับซ้อน เช่น การแปลงข้อมูล ให้ใช้ขั้นตอน .custom พร้อมคลอเชอร์ willMigrate และ didMigrate
static let migrateV1toV2 = MigrationStage.custom(
fromVersion: AppSchemaV1.self,
toVersion: AppSchemaV2.self,
willMigrate: { context in
// transform old data
},
didMigrate: nil
)NSPersistentCloudKitContainer
แทนที่ NSPersistentContainer ด้วย NSPersistentCloudKitContainer เพื่อเปิดใช้การซิงค์กับ CloudKit
let container = NSPersistentCloudKitContainer(name: "MyModel")
container.loadPersistentStores { _, error in
if let error { fatalError("\(error)") }
}
container.viewContext.automaticallyMergesChangesFromParent = trueข้อกำหนดของ CloudKit
การซิงค์กับ CloudKit ต้องมีบัญชี iCloud ที่ลงชื่อเข้าใช้แล้ว สิทธิ์การใช้งาน CloudKit และคอนเทนเนอร์ CloudKit ที่กำหนดค่าไว้ในพอร์ทัลนักพัฒนา
// Xcode: Signing & Capabilities → + → iCloud → CloudKit
// Enable "Use CloudKit" in Core Data model inspectorSwiftData กับ CloudKit
ส่ง ModelConfiguration ที่มี cloudKitDatabase เพื่อเปิดใช้การซิงค์กับ CloudKit ใน SwiftData
let config = ModelConfiguration(
schema: schema,
cloudKitDatabase: .automatic
)
let container = try ModelContainer(for: schema, configurations: config)การจัดการข้อขัดแย้งในการซิงค์
Core Data CloudKit แก้ไขข้อขัดแย้งด้วยนโยบายการเขียนครั้งล่าสุดชนะ ควรออกแบบโมเดลเพื่อลดการแย่งกันเขียนพร้อมกัน
// Best practice: keep models granular
// One attribute per write concern
// Avoid large blobs that frequently changeการทดสอบการย้ายข้อมูล
ทดสอบการย้ายข้อมูลกับสำเนาของที่จัดเก็บข้อมูลจริงก่อนเผยแพร่ เพื่อค้นหาปัญหาก่อนที่จะส่งผลกระทบต่อผู้ใช้
// Copy production store to a temp location
// Load it with the new container and verify objects are intactการตรวจติดตามการย้ายข้อมูล
รับฟังการแจ้งเตือนการย้ายข้อมูลของ Core Data เพื่อแสดงส่วนติดต่อผู้ใช้รายงานความคืบหน้าระหว่างการย้ายข้อมูลที่ใช้เวลานาน
NotificationCenter.default.addObserver(
forName: .NSPersistentStoreCoordinatorStoresWillChange,
object: container.persistentStoreCoordinator,
queue: .main
) { _ in showMigrationProgress() }ตรวจสอบความเข้าใจ
คลาสย่อยใดของ NSPersistentContainer ที่เปิดใช้การซิงค์กับ CloudKit โดยอัตโนมัติ
ทบทวนบทเรียน
เปิดใช้การย้ายข้อมูลแบบเบาด้วย shouldMigrateStoreAutomatically สำหรับการเปลี่ยนแปลงง่าย ๆ ใช้ VersionedSchema ร่วมกับ SchemaMigrationPlan สำหรับ SwiftData และเปิดใช้การซิงค์กับ CloudKit โดยเปลี่ยนไปใช้ NSPersistentCloudKitContainer หรือ ModelConfiguration(cloudKitDatabase: .automatic)
คำถามที่พบบ่อย
บทเรียน “การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit”
ย้ายการเปลี่ยนแปลงโครงสร้างข้อมูล และเปิดใช้การซิงค์ CloudKit ด้วย NSPersistentCloudKitContainer คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สแตก Core Data: การตั้งค่า NSPersistentContainer
- SwiftData @Model และ ModelContext
- ความสัมพันธ์และ Fetch Descriptors
- การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit