ความสัมพันธ์และ Fetch Descriptors
จำลองความสัมพันธ์แบบหนึ่งต่อหลาย และสืบค้นด้วย FetchDescriptor
ความสัมพันธ์และ Fetch Descriptors เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
ความสัมพันธ์ใน SwiftData
ประกาศความสัมพันธ์ระหว่างคลาส @Model โดยใช้คุณสมบัติของ Swift และ SwiftData จะอนุมานชนิดของความสัมพันธ์ให้
@Model
class Author {
var name: String
@Relationship(deleteRule: .cascade) var books: [Book] = []
init(name: String) { self.name = name }
}แอตทริบิวต์ @Relationship
ใช้ @Relationship เพื่อระบุกฎการลบและความสัมพันธ์ย้อนกลับอย่างชัดเจน
@Model
class Book {
var title: String
var author: Author?
init(title: String) { self.title = title }
}กฎการลบ
กฎการลบจะควบคุมสิ่งที่จะเกิดขึ้นกับออบเจ็กต์ที่เกี่ยวข้องเมื่อออบเจ็กต์แม่ถูกลบ ได้แก่ .nullify, .cascade และ .deny
// .cascade: deleting Author deletes all Books
// .nullify: deleting Author sets book.author to nil
// .deny: prevents deletion if related objects exist
@Relationship(deleteRule: .cascade) var books: [Book] = []ความสัมพันธ์แบบหนึ่งต่อกลุ่ม
ความสัมพันธ์แบบหนึ่งต่อกลุ่มจะประกาศเป็นคุณสมบัติอาร์เรย์ที่ฝั่ง "หนึ่ง"
@Model class Department {
var name: String
@Relationship(deleteRule: .cascade) var employees: [Employee] = []
init(name: String) { self.name = name }
}
@Model class Employee {
var name: String
var department: Department?
init(name: String) { self.name = name }
}ความสัมพันธ์แบบกลุ่มต่อกลุ่ม
ประกาศอาร์เรย์ทั้งสองฝั่งสำหรับความสัมพันธ์แบบกลุ่มต่อกลุ่ม
@Model class Student {
var name: String
var courses: [Course] = []
init(name: String) { self.name = name }
}
@Model class Course {
var title: String
var students: [Student] = []
init(title: String) { self.title = title }
}FetchDescriptor
FetchDescriptor มาแทนที่ NSFetchRequest ใน SwiftData โดยกำหนดค่าได้ด้วยเงื่อนไขคัดกรอง การเรียงลำดับ และขีดจำกัดการดึงข้อมูล
var descriptor = FetchDescriptor<Book>(
predicate: #Predicate { $0.title.contains("Swift") },
sortBy: [SortDescriptor(\Book.title)]
)
descriptor.fetchLimit = 10
let books = try context.fetch(descriptor)การเรียงลำดับด้วย SortDescriptor
ส่งอาร์เรย์ของ SortDescriptor ให้กับ FetchDescriptor เพื่อเรียงลำดับหลายคอลัมน์
let descriptor = FetchDescriptor<Item>(
sortBy: [
SortDescriptor(\Item.priority, order: .reverse),
SortDescriptor(\Item.name)
]
)การนับโดยไม่ดึงข้อมูล
ใช้ context.fetchCount เพื่อนับระเบียนที่ตรงเงื่อนไขโดยไม่โหลดออบเจ็กต์ทั้งหมดเข้าสู่หน่วยความจำ
let descriptor = FetchDescriptor<Book>(
predicate: #Predicate { $0.rating > 4 }
)
let count = try context.fetchCount(descriptor)
print("High-rated books: \(count)")การดึงความสัมพันธ์ล่วงหน้า
กำหนด relationshipKeyPathsForPrefetching ให้กับ FetchDescriptor เพื่อโหลดออบเจ็กต์ที่เกี่ยวข้องล่วงหน้า
var descriptor = FetchDescriptor<Author>()
descriptor.relationshipKeyPathsForPrefetching = [\Author.books]
let authors = try context.fetch(descriptor)@Query พร้อมตัวเลือกแบบ FetchDescriptor
มาโคร @Query รองรับตัวเลือกการเรียงลำดับและเงื่อนไขคัดกรองแบบเดียวกับ FetchDescriptor
@Query(
filter: #Predicate<Book> { $0.author?.name == "Apple" },
sort: \Book.title
)
var books: [Book]การดำเนินการแบบกลุ่ม
SwiftData รองรับการลบแบบกลุ่มผ่าน context.delete(model:where:) เพื่อดำเนินการกับข้อมูลจำนวนมากอย่างมีประสิทธิภาพ
try context.delete(model: Book.self, where: #Predicate { $0.rating < 2 })ตรวจสอบความเข้าใจ
ชนิดใดของ SwiftData ที่มาแทนที่ NSFetchRequest สำหรับดึงออบเจ็กต์ @Model พร้อมการกรองและการเรียงลำดับ
ทบทวนบทเรียน
ประกาศความสัมพันธ์ด้วย @Relationship(deleteRule:) บนคลาส @Model ใช้ FetchDescriptor ร่วมกับ #Predicate และ SortDescriptor เพื่อค้นหาข้อมูล ใช้ fetchCount สำหรับการนับ และใช้การลบแบบกลุ่มเพื่อลบข้อมูลจำนวนมาก
เรียนรู้ Swift ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 122
- บทเรียน
- 409
คำถามที่พบบ่อย
บทเรียน “ความสัมพันธ์และ Fetch Descriptors” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ความสัมพันธ์และ Fetch Descriptors” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ความสัมพันธ์และ Fetch Descriptors”
จำลองความสัมพันธ์แบบหนึ่งต่อหลาย และสืบค้นด้วย FetchDescriptor คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ความสัมพันธ์และ Fetch Descriptors” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สแตก Core Data: การตั้งค่า NSPersistentContainer
- SwiftData @Model และ ModelContext
- ความสัมพันธ์และ Fetch Descriptors
- การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit