6
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

初心者がKotlinでFirebase Realtime Databaseを使ってみた

Posted at

#Firebase Realtime Databaseとは
本格的なアプリを作ろうと思ったらデータベースって必要だよね。
Firebaseさんはそれも提供してくれるなんて粋だねえ。

OracleとかMySQLとかとちょっと違うのは
リレーショナルデータベースでないこと
アプリでの使用に特化していることなんだって。

#準備
##Firebaseと接続
こちらを参考にアプリとFirebaseを接続しよう
https://qiita.com/Natsuki_on_Rails/items/38cfcf6829e282b6f63e

##Realtime Databaseを作成
スクリーンショット 2018-12-31 23.08.53.png
スクリーンショット 2018-12-31 23.08.59.png
とりあえずテストモードで
スクリーンショット 2018-12-31 23.09.16.png
これで箱ができた
スクリーンショット 2018-12-31 23.09.41.png

##書き込みボタンをつくる
###依存関係の追加

  implementation 'com.google.firebase:firebase-database:XX.X.X'

この一文をアプリレベルのbuild.gradleファイルに追記する
スクリーンショット 2018-12-31 23.14.10.png
スクリーンショット 2018-12-31 23.14.15.png
dependencies{}のなかね
バージョンはfirebase-coreと揃えるといい感じ

###レイアウトファイルの作成
スクリーンショット 2018-12-31 23.22.20.png
ただボタンおいただけ

main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <Button
            android:text="@string/write"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/writeButton" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="148dp"
            app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="231dp"/>
</android.support.constraint.ConstraintLayout>

###アクティビティの実装

MainActivity.kt
package com.test.test

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import com.google.firebase.database.FirebaseDatabase


class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val database = FirebaseDatabase.getInstance()
        val ref = database.getReference("hogehoge")
        val buttonWrite = findViewById<Button>(R.id.writeButton)

        buttonWrite.setOnClickListener {
            ref.setValue("fugafuga")
        }
    }
}

①FirebaseDatabaseのインポート

import com.google.firebase.database.FirebaseDatabase

②共有インスタンス取得

val database = FirebaseDatabase.getInstance()

③hogehogeへのリファレンスの取得

val ref = database.getReference("hogehoge")

④ボタン押下時にhogehogeへfugafugaをセット

ref.setValue("fugafuga")

###ボタンを押すと
スクリーンショット 2018-12-31 23.22.37.png

hogehogeにfugafugaが作られた!

ちなみにこんな感じに書くとどんどんネストできる

ref.child("fugafuga").setValue("hagehage")
スクリーンショット 2018-12-31 23.34.32.png

##読み込みボタンを作る
###レイアウトファイル
ボタンをもう一個追加
スクリーンショット 2018-12-31 23.46.06.png

main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <Button
            android:text="@string/write"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/writeButton" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="84dp"
            app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="228dp"/>
    <Button
            android:text="@string/read"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/readButton"
            android:layout_marginEnd="78dp"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"
            android:layout_marginTop="228dp"/>
</android.support.constraint.ConstraintLayout>

###アクティビティファイル

MainActivity.kt
package com.test.test

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener


class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        val database = FirebaseDatabase.getInstance()
        val ref = database.getReference("hogehoge")
        val buttonWrite = findViewById<Button>(R.id.writeButton)
        val buttonRead = findViewById<Button>(R.id.readButton)

        buttonWrite.setOnClickListener {
            ref.setValue("fugafuga")
        }
        
        //追加↓
        buttonRead.setOnClickListener {
            ref.addValueEventListener(object : ValueEventListener {
                override fun onDataChange(dataSnapshot: DataSnapshot) {
                    val value = dataSnapshot.getValue(String::class.java)
                    Toast.makeText(baseContext, value,
                        Toast.LENGTH_LONG).show()
                }
                override fun onCancelled(error: DatabaseError) {
                    Toast.makeText(baseContext, "読み込み失敗",
                        Toast.LENGTH_LONG).show()
                }
            })
        }
    }
}

データベースからの読み込みの場合は書き込みの時ほど簡単には書けないっぽい

            ref.addValueEventListener(object : ValueEventListener {
                override fun onDataChange(dataSnapshot: DataSnapshot) {
                    val value = dataSnapshot.getValue(String::class.java)
                    Toast.makeText(baseContext, value,
                        Toast.LENGTH_LONG).show()
                }
                override fun onCancelled(error: DatabaseError) {
                    Toast.makeText(baseContext, "読み込み失敗",
                        Toast.LENGTH_LONG).show()
                }
            })

onDataChangeとonCancelledっていうメソッドをオーバーライドしてあげないといけないみたい
データが書き換わった時に備えてリスナーになってるのかな?

val value = dataSnapshot.getValue(String::class.java)

ここでrefの中の値を取ってきてる
中身はトーストで出してみた。

###ボタンを押すと
データベースがこんな感じだと
スクリーンショット 2018-12-31 23.49.34.png
fugafugaがトーストされる!
スクリーンショット 2018-12-31 23.49.08.png

リレーショナルデータベースと違うからそっち知ってると戸惑っちゃうね。

6
12
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
6
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?