🍎

Firebase Realtime DatabaseでCodableを利用する

2022/05/28に公開

はじめに

Realtime DatabaseはJSON形式でデータが格納されているため、保存/取得にはプリミティブな型しか利用することができません。
このままでは扱いづらいため、手動でstruct/classへのパース処理を書いたり、 Data の変換を経由して Codable を利用したり、と手間がかかっていました。

Firebase Apple SDK 9.0.0 でRealtime DatabaseのSwift拡張である FirebaseDatabaseSwift が正式リリースされ、標準で Codable が利用できるようになりました。

導入

今回はSwift Package Managerを利用していることを前提とします。

FirebaseDatabase , FirebaseDatabaseSwift の2つにチェックを入れ、 Add Package をクリックします。
(他は必要に応じてチェックを入れてください)

実装

Realtime Databaseを利用する箇所で以下のimportを追加します。

import FirebaseDatabase
import FirebaseDatabaseSwift

以降のサンプルコードはFirebaseのドキュメントに合わせています。

書き込み

DatabaseReference#setValue(Any?) ではなく、 DatabaseReference#setValue(from: Encodable) を使います。

do {
  self.ref.child("users").child(user.uid).setValue(from: user)
} catch {
  // エラー処理
}

読み込み

DataSnapshot#value: Any? ではなく、 DataSnapshot#data(as: Decodable.Type) を使います。

リスナーを使った例
refHandle = postRef.observe(DataEventType.value, with: { snapshot in
  do {
    let user = try snapshot.data(as: User.self)
  } catch {
    // エラー処理
  }
})
データを一度だけ取得する例
ref.child("users/\(uid)/username").getData(completion:  { error, snapshot in
  guard error == nil else {
    print(error!.localizedDescription)
    return;
  }

  do {
    let user = try snapshot.data(as: User.self)
  } catch {
    // エラー処理
  }
});

まとめ

Firebase Apple SDK 9.0.0 以上で利用可能なRealtime Databaseの便利な機能の紹介でした。
注意点としては Xcode 13.3.1 以上が必要になるため、環境がそろっている かつ Realtime Databaseを利用されているプロダクトであれば導入してみてはいかがでしょうか。

Discussion