0Pricing
Swift Academy · Lektion

Beziehungen und Fetch Descriptors

Modellieren Sie Eins-zu-viele-Beziehungen und fragen Sie Daten mit FetchDescriptor ab.

Beziehungen und Fetch Descriptors ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Beziehungen in SwiftData

Definieren Sie Beziehungen zwischen @Model-Klassen mithilfe von Swift-Eigenschaften. SwiftData leitet den Beziehungstyp automatisch ab.

@Model
class Author {
  var name: String
  @Relationship(deleteRule: .cascade) var books: [Book] = []
  init(name: String) { self.name = name }
}

@Relationship-Attribut

Verwenden Sie @Relationship, um Löschregeln und inverse Beziehungen explizit festzulegen.

@Model
class Book {
  var title: String
  var author: Author?
  init(title: String) { self.title = title }
}

Löschregeln

Löschregeln bestimmen, was mit verknüpften Objekten geschieht, wenn das übergeordnete Objekt gelöscht wird: .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] = []

Eins-zu-viele-Beziehung

Eine Eins-zu-viele-Beziehung wird auf der Seite mit dem "einen" Objekt als Array-Eigenschaft definiert.

@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 }
}

Viele-zu-viele-Beziehungen

Definieren Sie auf beiden Seiten Arrays für eine Viele-zu-viele-Beziehung.

@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 ersetzt NSFetchRequest in SwiftData. Konfigurieren Sie ihn mit Prädikat, Sortierung und Abruflimit.

var descriptor = FetchDescriptor<Book>(
  predicate: #Predicate { $0.title.contains("Swift") },
  sortBy: [SortDescriptor(\Book.title)]
)
descriptor.fetchLimit = 10
let books = try context.fetch(descriptor)

Mit SortDescriptor sortieren

Übergeben Sie ein Array aus SortDescriptor an FetchDescriptor, um nach mehreren Spalten zu sortieren.

let descriptor = FetchDescriptor<Item>(
  sortBy: [
    SortDescriptor(\Item.priority, order: .reverse),
    SortDescriptor(\Item.name)
  ]
)

Zählen ohne Abruf

Verwenden Sie context.fetchCount, um passende Datensätze zu zählen, ohne alle Objekte in den Speicher zu laden.

let descriptor = FetchDescriptor<Book>(
  predicate: #Predicate { $0.rating > 4 }
)
let count = try context.fetchCount(descriptor)
print("High-rated books: \(count)")

Beziehungen vorab laden

Setzen Sie relationshipKeyPathsForPrefetching an einem FetchDescriptor, um verknüpfte Objekte eager zu laden.

var descriptor = FetchDescriptor<Author>()
descriptor.relationshipKeyPathsForPrefetching = [\Author.books]
let authors = try context.fetch(descriptor)

@Query mit FetchDescriptor-ähnlichen Optionen

Das @Query-Makro unterstützt dieselben Sortierungs- und Prädikatsoptionen wie FetchDescriptor.

@Query(
  filter: #Predicate<Book> { $0.author?.name == "Apple" },
  sort: \Book.title
)
var books: [Book]

Batch-Operationen

SwiftData unterstützt Batch-Löschvorgänge über context.delete(model:where:) für effiziente Massenoperationen.

try context.delete(model: Book.self, where: #Predicate { $0.rating < 2 })

Kurze Überprüfung

Welcher SwiftData-Typ ersetzt NSFetchRequest beim Abrufen von @Model-Objekten mit Filtern und Sortierung?

Zusammenfassung der Lektion

Definieren Sie Beziehungen mit @Relationship(deleteRule:) an @Model-Klassen. Verwenden Sie FetchDescriptor mit #Predicate und SortDescriptor, um Daten abzufragen. Nutzen Sie fetchCount zum Zählen und Batch-Löschvorgänge zum massenhaften Entfernen.

Häufig gestellte Fragen

Ist die Lektion „Beziehungen und Fetch Descriptors“ kostenlos?

Ja — der vollständige Text von „Beziehungen und Fetch Descriptors“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Beziehungen und Fetch Descriptors“?

Modellieren Sie Eins-zu-viele-Beziehungen und fragen Sie Daten mit FetchDescriptor ab. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Beziehungen und Fetch Descriptors“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Core-Data-Stack: NSPersistentContainer einrichten
  2. SwiftData @Model und ModelContext
  3. Beziehungen und Fetch Descriptors
  4. Einfache Migrationen und CloudKit-Synchronisierung
← Zurück zu Swift Academy