LoginSignup
0
0

More than 3 years have passed since last update.

[Android] Realtime Databaseを使ってみる

Posted at

前回は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()で指定します。(他の方法知りません)

Firebaseコンソールで確認

読み取り

データ読み取りを行うには、作成したdatabase.referenceValueEventListenerを追加する必要があります。公式から抜粋

        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()が呼び出される。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0