본문 바로가기

Android Project

예제 앱 만들기(3) - 게시글 등록

이번에는 게시판 예제를 만들어서 리얼타임 데이터베이스에 대해 이해하는 작업을 해볼것이다

 

BoardListActivity, BoardWriteActivity와 각각에 해당하는 xml파일을 생성해준다

 

MainActivity로 돌아가서 로그인 성공하면 BoardListActivity로 이동하도록 코드를 짜준다

// 로그인
auth.signInWithEmailAndPassword(email.text.toString(), pwd.text.toString())
    //로그인 성공
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show()
            Toast.makeText(this, auth.currentUser?.uid.toString(), Toast.LENGTH_SHORT).show()

            // 로그인성공하면 BoardListActivity로 이동
            val intent = Intent(this, BoardListActivity::class.java)
            startActivity(intent)

            //로그인 실패
        } else {
            Toast.makeText(this, "no", Toast.LENGTH_SHORT).show()

        }
    }

MainActivity.kt

 

 

그리고 글을 쓸수있도록 글쓰기 버튼을 추가해준다

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BoardListActivity">

    <Button
        android:id="@+id/writeBtn"
        android:text="글쓰기"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_board_list.xml

 

activity_board_list.xml

 

 

 

BoardListActivity.kt으로 이동해서 글쓰기 버튼을 누르면 BoardWriteActivity로 이동하도록 한다 

package com.example.mysampleapp

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

class BoardListActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_board_list)

        // writeBtn누르면 BoardWriteActivity이동
        val writeBtn = findViewById<Button>(R.id.writeBtn)
        writeBtn.setOnClickListener {

            val intent = Intent(this, BoardWriteActivity::class.java)
            startActivity(intent)
        }
    }
}

BoardListActivity.kt

 

 

 

activity_board_write.xml로 가서 글쓰기 페이지를 디자인해준다

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BoardWriteActivity"
    android:orientation="vertical">

    <EditText
        android:id="@+id/writeTextArea"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/writeUploadBtn"
        android:text="글쓰기"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

activity_board_write.xml

 

activity_board_write.xml

 

 글을쓰고 글쓰기 버튼을 눌렀을 때 파이어베이스에 내가 글쓴 내용이 반영되도록 해보겠다

push()를 사용하면 내가 쓴 글들이 파이어베이스에 계속 줄줄이 등록되는것을 볼수있다

그리고 먼저 Model데이터 클래스를 생성해서 아래와같이 코드를 짜준다

package com.example.mysampleapp

data class Model (
    val title : String = ""
)

Model.kt

 

 

BoardWriteActivity로 돌아와서 아래와 같이 코드를 작성해준다

package com.example.mysampleapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import com.google.firebase.database.ktx.database
import com.google.firebase.ktx.Firebase

class BoardWriteActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_board_wright)

        val writeBtn : Button =  findViewById(R.id.writeUploadBtn)
        writeBtn.setOnClickListener {

            val writeText = findViewById<EditText>(R.id.writeTextArea)

            // 파이어베이스 게시물 읽고쓰기
            // Write a message to the database
            val database = Firebase.database
            val myRef = database.getReference("board")

            myRef.push().setValue(
                Model(writeText.text.toString())
            )
        }
    }
}

BoardWriteActivity.kt

 

 

여기까지하면 내가 쓴 글이 파이어베이스 리얼타임 데이터베이스에 title이라는 항목에 반영되는것을 확인할수있다

 

 

 

이렇게 "안녕하세요"라고 쓰고 글쓰기를 누른 후 파이어베이스 실시간데이터베이스를 확인해보면 board안에 titled안에 내가 적은 글이 등록되는것을 확인할수있다

 

 

 

 

 

 

 

 

<오류>

앱을 빌드하던중에 앱이 계속 종료되서 로그캣을 살펴보았더니 아래와같은 오류가 발생했었다

Default FirebaseApp is not initialized in this process com.example.mysampleapp. Make sure to call FirebaseApp.initializeApp(Context) first.

 

나는 강의를 들으면서 앱을 만들고있었는데 강의에서 안드로이드 버전과 살짝 달라서 수정해주었다

 

 

변경 전

현재 build.gradle(Project) 코드는 이렇게 되어있지만 아래와같이 추가해준다

변경 후

 

 

그다음엔 build.gradle(app)으로 들어가서 plugins에 아래 코드 한줄을 더 추가해준다

 

 

이렇게하고 sync now를 시켜주면 오류가 해결이 되서 앱이 잘 작동하는것을 확인할수있었다