Firebaseでお手軽サーバレスアプリ（Realtime Database+CloudFunctions+Cloud Messaging+Android(kotlin)+iOS(swift)）その２

# はじめに
今回はデータを構造化して書き込むのと
書き込んだデータを取得し表示する所までを実装します。

# データ構造

"log"をキーとし自動採番で"name"と"message"と"timestamp"の文字列を追加していく構造とします。


# コードを追加

## データクラス

```kotlin

data class Data(
    var Name: String? ="",
    var Message: String? ="",
    var Timestamp: String?= ""
)
```

## データの書き込み
前回追加したコードを修正します

```kotlin

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

        val database = FirebaseDatabase.getInstance()
        val myRef = database.getReference("log")

        fab.setOnClickListener {
            val newData = Data("user1","オレオレ", System.currentTimeMillis().toString())
            myRef.push().setValue(newData)
        }
    }
```


## データを表示する部分を追加します
データが追加される毎に自動的に更新されます

```kotlin

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

        val database = FirebaseDatabase.getInstance()
        val myRef = database.getReference("log")

        fab.setOnClickListener {
            val newData = Data("user1","オレオレ", System.currentTimeMillis().toString())
            myRef.push().setValue(newData)
        }

        myRef.addChildEventListener(object : ChildEventListener {
            override fun onChildAdded(dataSnapshot: DataSnapshot, p1: String?) {
                var currentText = textView.text.toString()
                val getData = dataSnapshot.getValue(Data::class.java)
                if(getData != null) {
                    currentText += "\n"
                    currentText += getData.Timestamp
                    currentText += " "
                    currentText += getData.Name
                    currentText += " "
                    currentText += getData.Message
                    textView.text = currentText
                }
            }
            override fun onCancelled(p0: DatabaseError) {
                println(p0.message)
            }
            override fun onChildMoved(p0: DataSnapshot, p1: String?) {
                println("A child removed !!!!!!!!!!!!!!!!!!")
            }
            override fun onChildChanged(p0: DataSnapshot, p1: String?) {
                println("A child changed !!!!!!!!!!!!!!!!!!")
            }
            override fun onChildRemoved(p0: DataSnapshot) {
                println("A child removed !!!!!!!!!!!!!!!!!!")
            }
        })
    }

```

![Screenshot_20200223-135601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577898/a4aa13ec-bfb0-9e81-0586-fbfadab16149.png)

![data.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577898/debffe22-24e3-abd7-2eda-84a21d129271.png)


#まとめ
データの書き込みと表示までできました。
このアプリを複数台のスマホで動かせば、書き込みと同時に表示されデータが常に同期されることを確認できると思います。簡単ですね。


# このシリーズについて

 [その１:全体像とFirebaseの準備](https://qiita.com/uchi2020/items/22cec9cbd8b65298844f)

 [その２:Androidのクライアントアプリからデータの登録と表示まで](https://qiita.com/uchi2020/items/3857098ca5e9052f4b52)


 [その３:iOSのクライアントアプリからデータの登録と表示まで](https://qiita.com/uchi2020/items/6cc6f1bc2465f6d4b318)


 [その４:準備中]

 [その５:準備中]