// 프래그먼트에서는 requireContext().applicationContext , 액티비티에서는 그냥 applicationContext
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>
반응형
'코딩ㆍ개발 정보 > 안드로이드앱 (코틀린)' 카테고리의 다른 글
라즈베리파이에 node.js 설치하기 (0) | 2024.01.10 |
---|---|
코틀린 indexOf() 특정 문자 위치 찾는 방법 (0) | 2024.01.09 |
코틀린 프래그먼트 생명주기 및 onCreateView(), onViewCreated() 차이 (0) | 2023.12.26 |
새 앱에 스플래시 화면 추가하기 (0) | 2023.12.26 |
리사이클러뷰에 아이템 클릭 리스너 넣기 (0) | 2023.12.26 |