Swift Academy · レッスン

リレーションシップとFetch Descriptor

一対多のリレーションシップをモデル化し、FetchDescriptorでクエリを実行します。

レッスン 3/413 ステップ

「リレーションシップとFetch Descriptor」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

SwiftDataのリレーションシップ

Swiftのプロパティを使って、@Modelクラス間のリレーションシップを宣言します。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

SwiftDataでは、FetchDescriptorがNSFetchRequestに代わります。述語、ソート、フェッチ上限を設定します。

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)")

リレーションシップのプリフェッチ

FetchDescriptorにrelationshipKeyPathsForPrefetchingを設定して、関連オブジェクトを先行読み込みします。

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

FetchDescriptorに似たオプションを使う@Query

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

確認問題

フィルタリングとソートを指定して@Modelオブジェクトをフェッチする際、NSFetchRequestに代わるSwiftDataの型はどれですか?

レッスンのまとめ

@Modelクラスで@Relationship(deleteRule:)を使ってリレーションシップを宣言します。#PredicateとSortDescriptorを指定したFetchDescriptorでデータを検索します。件数の取得にはfetchCountを、大量削除にはバッチ削除を使用します。

無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「リレーションシップとFetch Descriptor」レッスンは無料ですか?

はい。「リレーションシップとFetch Descriptor」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「リレーションシップとFetch Descriptor」で何を学びますか?

一対多のリレーションシップをモデル化し、FetchDescriptorでクエリを実行します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「リレーションシップとFetch Descriptor」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Core Dataスタック:NSPersistentContainerの設定
  2. SwiftDataの@ModelとModelContext
  3. リレーションシップとFetch Descriptor
  4. 軽量マイグレーションとCloudKit同期
← Swift Academyに戻る