前回はFirebase Authenticationを触りましたが、今回はRealtime Databaseを使ってみたい思います。
Firebase設定
Realtime Databeseを使用するには、Databaseルールというものを記述しなければならない。
{
"rules": {
"foo": {
".read": true,
".write": false
}
}
}
上記のルールは、あらゆるユーザーが/foo/
以下の読み取りを許可するというものになります。/foo/
以下というのは、
{
"rules": {
"foo": {
".read": true,
".write": false,
"hoo": {
".read": false,
".write": false
}
}
}
}
この場合、/hoo/
の読み取りを許可しない設定にしていても、権限はデータベース内の浅いパスの方が優先されるため、/hoo/
以下の読み取りが可能になります。
前回、Authenticationの設定をしてのでユーザごとにアクセス制御ができるみたいです。実際に設定したルールは以下です。
{
"rules": {
"foo": {
"$uid": {
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
}
}
}
ログインしたユーザーだけが自分だけのデータを閲覧できるルールを記述しました。
実装
Gradle
implementation 'com.google.firebase:firebase-database-ktx:19.4.0'
書き込み
データの読み書きを行うには、DatabaseReference
インスタンスを使用します。
class LogoutActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth
private lateinit var database: DatabaseReference
override fun onCreate(savedInstanceState: Bundle?) {
// ...
auth = Firebase.auth
// インスタンス生成
databaseRef = Firebase.database.reference
// (ログインしていれば)データ追加
// root/foo/auth.uid/
button.setOnClickListener {
auth.uid?.let {
database.child("foo").child(it).setValue(User("hoge", "12"))
}
}
// ...
}
setValue()
で、データを追加したいパスにデータを追加します。今回は、/foo/auth.uid/
にユーザー情報(name, age)を追加してみました。パスの指定は.child()
で指定します。(他の方法知りません)
読み取り
データ読み取りを行うには、作成したdatabase.reference
にValueEventListener
を追加する必要があります。公式から抜粋
val postListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
// Get Post object and use the values to update the UI
val post = dataSnapshot.value
Log.d("TAG", post.toString())
// ...
}
override fun onCancelled(databaseError: DatabaseError) {
// Getting Post failed, log a message
Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
// ...
}
}
// ...
database.child("foo").child(auth.uid!!).addValueEventListener(postListener)
// ...
onDataChage()
メソッドはリスナーがアタッチされた時に1回トリガーされ、データが変更されるたびにトリガーされます。読み取りができない場合(権限がないなど)は、onCancelled()
が呼び出される。