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
- Core-Data-Stack: NSPersistentContainer einrichten
- SwiftData @Model und ModelContext
- Beziehungen und Fetch Descriptors
- Einfache Migrationen und CloudKit-Synchronisierung