Swift Academy · บทเรียน

ความสัมพันธ์และ Fetch Descriptors

จำลองความสัมพันธ์แบบหนึ่งต่อหลาย และสืบค้นด้วย FetchDescriptor

บทเรียน 3 จาก 413 ขั้นตอน

ความสัมพันธ์และ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สแตก Core Data: การตั้งค่า NSPersistentContainer
  2. SwiftData @Model และ ModelContext
  3. ความสัมพันธ์และ Fetch Descriptors
  4. การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit
← กลับไปที่ Swift Academy