7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【解決】SwiftDataでThread 1: Fatal error: failed to find a currently active container for xxxxxxxとなった場合の対処法

Last updated at Posted at 2023-12-20

概要

SwiftData使用時に、

Thread 1: Fatal error: failed to find a currently active container for xxxxxxx

というエラーが出た時の原因を二つ確認しているので、備忘も兼ねて書いておきます。

.modelContainer(for: xxxx.self)を宣言していない

SwiftDataの導入直後によくあるのが、Appファイル上に.modelContainer(for: xxxx.self)(xxxxはModel名)を宣言していないが故に発生する問題です。

Appファイルというのはプロジェクト作成時にプロジェクト名で自動的に生成されるファイルのことを指します。
例えば、SwiftDataDemoという名前でプロジェクトを生成した場合、SwiftDataDemoAppという名称で、以下のようにAppファイルが生成されます。
その中に、modelContainerを宣言しておかないと掲題のエラーが発生し、アプリがクラッシュします。

SwiftDataDemoApp.swift
import SwiftUI

@main
struct SwiftDataDemoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .modelContainer(for: SiteInfo.self) // これがないと落ちる
        }
    }
}

上記の例では以下のようなSiteInfoモデルを宣言しているため、SiteInfo.selfを宣言しています。

Models.swift
import Foundation
import SwiftData

@Model
final class SiteInfo {
    var name: String
    var code: String
    let createdAt: Date

    init(name: String,code: String) {
        self.name = name
        self.code = code
        createdAt = Date()
    }
}

一度作成したSwiftDataの構造を変更した場合

SwiftData内にデータを保持している状態@Modelのついているクラスを更新し、アプリ上でデータを操作しようとするとアプリがクラッシュします。

例えば、
1.SiteInfo内にデータを追加する
2.以下のようにSiteInfoを更新する
3.アプリ上でSiteInfoに関する操作を行う

上記の手順で操作を行うとアプリがクラッシュします。

Models.swift
import Foundation
import SwiftData

@Model
final class SiteInfo {
    var name: String
    var code: String
    let createdAt: Date
+   var createdBy:String // 追加する

+   init(name: String,code: String,createdBy: String) {
        self.name = name
        self.code = code
+       self.createdBy = createdBy
        createdAt = Date()
    }
}

これは元々持っているデータとの不整合が発生するためにエラーが発生するようで、操作するクラス内に存在している全てのデータを削除したうえで操作を行う、ということでクラッシュを回避できます。
アプリを削除するのが手っ取り早い方法です。

その内他にもSwiftData周りのエラーやTipsについて記事をまとめていこうと思います。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?