【SwiftUI】RealmのList型の使い方とForEachで取り出す方法

【SwiftUI】RealmのList型の使い方とForEachで取り出す方法

この記事からわかること

  • Realm SwiftList型とは?
  • 使い方定義方法
  • ForEachを使ったデータ取り出し方
  • 配列からのキャスト(型変換)

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

iOSアプリに簡単に導入できるデータベースRealmのList型についてまとめていきたいと思います。

RealmのList型とは?

List型はRealm Swiftライブラリを導入すると使用可能になるコレクション形式のクラスの1つです。Swiftで扱えるArrayと似たような形式であり、同じような操作方法で扱うことができます。しかしRealmではArray型は扱えないのでRealm用のコレクション型が用意されています。

 public final class List<Element> : RLMSwiftCollectionBase, RealmCollectionImpl where Element : RealmCollectionValue

公式リファレンスによると「Listは1対多関係を定義するために使用されるRealmのコンテナータイプです」と記述されていました。1つのデータに対して複数の値が紐づくような構造の際に使用してねってことのようです。

格納できるデータ型はBoolIntInt8Int16Int32Int64DoubleFloatStringDateDataなどです。

List型のテーブル定義

1対多となるテーブル定義での使い方を見ていきます。今回は1つのグループ(UserGroup)の中に複数のユーザー(User)が格納される場合で使用してみます。

テーブルで定義する際はRealmSwift.List<Element>のように指定します。クラスは初期値が必要なので()をつけて空のListを生成しています。

テーブル定義

class User: Object,ObjectKeyIdentifiable {
  @Persisted(primaryKey: true) var id: ObjectId
  @Persisted  var name:String = ""
  @Persisted  var age:Int = 0
}

class UserGroup: Object, ObjectKeyIdentifiable {
  @Persisted(primaryKey: true) var id: ObjectId
  @Persisted  var users = RealmSwift.List<User>()
}

実際のRealmデータ

Results<UserGroup> <0x159e046d0> (
	[0] UserGroup {
		id = 633428ac38f833c83b7fcb49;
		users = List<User> <0x600002f60000> (
			[0] User {
				id = 633428ae38f833c83b7fcb4a;
				name = ame;
				age = 20;
			},
			[1] User {
				id = 633428af38f833c83b7fcb4b;
				name = kasa;
				age = 80;
			}
		);
	}
)

これで上記のようなデータが生成できます。id1つに対して複数のユーザーが紐づいている形になっています。

List型はForEachで取り出せる

定義されているテーブルがObjectKeyIdentifiableプロトコルに準拠している場合、List型はForEachやListなどで回してデータを取り出すことができます。

struct ContentView: View {
    
  @ObservedResults(UserGroup.self) var groups
  
  var body: some View {
    if let group = groups.first{
      List {
        ForEach(group.users) { user in
          HStack{
              Text(user.name)
              Text("\(user.age)")
          }
        }.listStyle(GroupedListStyle())
      }
    }
  }
}

配列からのキャスト(型変換)

配列(Array)型はRealmSwift.Listappend(objectsIn:)メソッドを使用することでキャストすることができます。

let array:Array<String> = ["A","B","C","D"]
let list = RealmSwift.List<String>()
list.append(objectsIn: array)

RealmSwift.Listから配列へのキャスト

RealmSwift.List型から配列(Array)型へはイニシャライザを使用することでキャストすることができます。以下は一度型から配列をRealmSwift.Listに変換しまた配列に戻しています。

var array:Array<String> = ["A","B","C","D"]
let list = RealmSwift.List<String>()
list.append(objectsIn: array)
array = Array(list)

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

私がSwift UI学習に使用した参考書

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index