-
본문으로 바로가기
// 프래그먼트에서는 requireContext().applicationContext , 액티비티에서는 그냥 applicationContext

 

출처: https://velog.io/@limsaehyun/Android-Kotlin-Room-DB%EC%9D%98-%EC%82%AC%EC%9A%A9%EB%B2%95%EA%B3%BC-%EC%98%88%EC%A0%9C

 

 

0. build.gradle (app)

1. LoginDao

2. LoginDatabase

3. LoginEntity

4. TrackFragment

5. fragment_track

 

 

0. build.gradle (app)

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
//    id 'com.google.gms.google-services'
    id 'androidx.navigation.safeargs.kotlin'
    id 'kotlin-kapt'
}
dependencies {
    def room_version="2.2.6"

    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
    testImplementation "androidx.room:room-testing:$room_version"

 

1. LoginDao

package org.tubepage.kotlincompo.database

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface LoginDao {

    @Query("Select * from LoginEntity")
    fun getLogin(): LoginEntity

    @Query("Delete from LoginEntity")
    fun deleteLogin()

    @Insert
    fun insertLogin(loginEntity: LoginEntity)
}

 

2. LoginDatabase

package org.tubepage.kotlincompo.database

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(
    entities = [LoginEntity::class],
    version = 1,
    exportSchema = false
)

abstract class LoginDatabase:RoomDatabase() {

    abstract fun loginDao() : LoginDao

    companion object{
        private var instance: LoginDatabase? = null
        @Synchronized
        fun getInstance(context: Context): LoginDatabase?{
            if(instance == null){
                synchronized(LoginDatabase::class){
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        LoginDatabase::class.java,
                        "login-database"
                    )
                        .build()
                }
            }
            return instance
        }
    }
}

3. LoginEntity

package org.tubepage.kotlincompo.database

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity

data class LoginEntity(
    val username: String,
    val password: String,
) {
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0
}

4. TrackFragment

package org.tubepage.kotlincompo

import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import androidx.navigation.NavController
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import org.tubepage.kotlincompo.database.LoginDatabase
import org.tubepage.kotlincompo.database.LoginEntity
import org.tubepage.kotlincompo.databinding.FragmentTrackBinding

class TrackFragment : Fragment() {

    private var _binding: FragmentTrackBinding? = null

    private val binding
        get() = _binding!!

    lateinit var navController: NavController

    private lateinit var db: LoginDatabase

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        //바인딩 클래스를 통해 지정(xml 지정 필요 없음)
        _binding = FragmentTrackBinding.inflate(inflater, container, false)

        //직접 XML 파일 지정
        _binding = DataBindingUtil.inflate(inflater, R.layout.fragment_track, container, false)


        val view = binding.root

        // 프래그먼트에서는 requireContext().applicationContext , 액티비티에서는 그냥 applicationContext
        db = LoginDatabase.getInstance(requireContext().applicationContext)!!
        refreshLogin()

        binding.btn.setOnClickListener {
            addLogin()
            refreshLogin()
            startLogin()
        }
        return view
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    }

    private fun startLogin() {
//        startActivity(Intent(applicationContext, SuccessActivity::class.java))
    }

    private fun addLogin() {
        val username = binding.etID.text.toString()
        val password = binding.etPW.text.toString()

        CoroutineScope(Dispatchers.IO).launch {
            db.loginDao().insertLogin(LoginEntity(username, password))
        }
    }

    private fun refreshLogin() {
        CoroutineScope(Dispatchers.Main).launch {
            val data = CoroutineScope(Dispatchers.IO).async {
                db.loginDao().getLogin()
            }.await()

            if(data != null) {
                binding.etID.setText("${data.username}")
                binding.etPW.setText("${data.password}")
            }
        }
    }

}

5. fragment_track

<?xml version="1.0" encoding="utf-8"?>
<layout 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">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".TrackFragment">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="TRACK"
            android:textSize="50sp"
            android:textStyle="bold" />
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="104dp"
            android:text="AutoLogin"
            android:textSize="24dp"
            android:textStyle="bold"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <EditText
            android:hint="ID"
            android:paddingLeft="24dp"
            android:id="@+id/etID"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="24dp"
            android:layout_marginTop="52dp"
            android:layout_marginEnd="24dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView" />

        <EditText
            android:hint="PW"
            android:paddingLeft="24dp"
            android:id="@+id/etPW"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="24dp"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="24dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/etID" />

        <Button
            android:id="@+id/btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="LOGIN"
            app:layout_constraintEnd_toEndOf="@+id/etPW"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="@+id/etPW"
            app:layout_constraintTop_toBottomOf="@+id/etPW" />

        </androidx.constraintlayout.widget.ConstraintLayout>
    </FrameLayout>
</layout>

 

 

반응형