Firebase Realtime DatabaseでCodableを利用する
はじめに
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