前回はRealtime Databaseを使ってみたが、今回はCloud FireStoreを使ってみる。
Gradle
implementation 'com.google.firebase:firebase-firestore:21.2.1'
実装
公式Documentを見る感じ、ルールとかの特別な設定とか特になしでできるっぽい?(お試しで使う場合)
Cloud FireStoreはRealtime Databeseとは違うデータモデルです。データを1つの大きなJsonツリーとして保存していたRealtime Databaseとは違って、データをドキュメントのコレクションとして保存します。
コレクション:複数のドキュメントを格納しているもの
ドキュメント: データを格納しているもの
データ書き込み
FirebaseFirestore.getInstance()
でデータベースを取得します。取得したデータベースにデータを追加してみる。
val db = FirebaseFirestore.getInstance()
val user = hashMap(
"name" to "hoge",
"age" to 12
)
db.collection("users").add(user) // 1
db.collection("users").document("user_id").set(user) //2
users
というコレクションに、ユーザ(ドキュメント)ごとのデータを追加しています。users
やuser_id
がなくても自動生成してくれるみたいです。一つ目のやり方はdocumentのuser_idを自動で割り振ってれるそうです。
新しいデータを使いすると、上書きされるみたいなので、データの更新をしたい時は
// user(name:"hoge", age:30) -> user(name:"hoge", age:30)
val useUpdate = hashMap("age" to 12)
db.collection("users).document("user_id").set(
"age" to 30,
SetOptions.merge()
)
// user(name:"hoge", age:30) -> user(age:30)
db.collection("users).document("user_id").set("age" to 30)
と思ったらupdate()
というメソッドがあるそうだ
db.collection("users").document("user_id").update("age", 30)
データ読み取り
データの読み取りにはget()
を使用する。
val user1 = User("u1", 12)
val user2 = User("u2", 22)
val user3 = User("u3", 32)
val user4 = User("u4", 42)
db.collection("users").add(user1)
db.collection("users").add(user2)
db.collection("users").add(user3)
db.collection("users").add(user4)
// [u1, u2, u3, u4]
db.collection("users").get().addOnCompleteListener { doc ->
Log.d(TAG, "data: ${doc.result?.documents?.map { it["name"] }}")
}
簡単なクエリを叩いてみる。
db.collection("users").whereLessThan("age", 30).get().addOnCompleteListener { doc ->
Log.d(TAG, "data: ${doc.result?.documents?.map { listOf(it["name"], it["age"]) }}")
}
whereLessThan()
は、指定した値よりも小さい値にヒットする。他にも色々あるので試してみたい。