質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

769閲覧

SwiftUIにてRealmSwiftを使用し、リストのデータを削除するとクラッシュしてしまう

Natsu.mikan

総合スコア6

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/04/02 15:28

編集2022/01/12 10:55

アプリは、一覧画面と詳細画面で構成されています。
詳細画面の削除ボタンをクリックすると、データが削除され、一覧画面に戻ります。

しかし、次のエラーでクラッシュしてしまいます。

Thread 1: Exception: "The RLMArray has been invalidated or the object containing it has been deleted."

もう一度アプリを起動するとデータは削除されていますが、
クラッシュせずに削除するにはどうすればいいでしょうか?

Swift

1struct ListView: View { 2 @ObservedObject private var fetcher = Fetcher() 3 4 var body: some View { 5 NavigationView { 6 VStack { 7 ForEach(self.fetcher.items) { (item: Item) in 8 NavigationLink(destination: DetailView(id: item.id)) { 9 Text(item.title) 10 } 11 } 12 } 13 } 14 } 15} 16struct DetailView: View { 17 var id: String 18 @ObservedObject private var fetcher = Fetcher() 19 @Environment(.presentationMode) private var presentationMode: Binding<PresentationMode> 20 21 var body: some View { 22 VStack { 23 Button(action: { 24 self.fetcher.delete(id: self.id) 25 self.presentationMode.wrappedValue.dismiss() 26 }) { 27 Text("Delete") 28 } 29 } 30 } 31} 32 33class Fetcher: ObservableObject { 34 var realm = try! Realm() 35 var objectWillChange: ObservableObjectPublisher = .init() 36 private(set) var items: Results<Item> 37 private var notificationTokens: [NotificationToken] = [] 38 39 init() { 40 items = realm.objects(Item.self) 41 42 notificationTokens.append(items.observe { _ in 43 self.objectWillChange.send() 44 }) 45 } 46 47 func delete(id: String) { 48 guard let item = realm.objects(Item.self).filter("id == '(id)'").first else { return } 49 50 try! realm.write() { 51 realm.delete(item) 52 } 53 } 54} 55 56class Item: Object, Identifiable { 57 @objc dynamic var id = NSUUID().uuidString 58 @objc dynamic var title = "" 59 @objc dynamic var createdAt = NSDate() 60 61 override static func primaryKey() -> String? { 62 return "id" 63 } 64}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問