1. Room
1-1. Room이란?
Room은 스마트폰 내장 DB에 데이터를 저장하기 위해 사용하는 라이브러리이다.
평소에 우리는 메모를 저장하고, 일정을 저장하고, 즐겨보는 웹툰을 즐겨찾기 하고... 사용자의 데이터를 내장 DB에 저장할 일이 많다. 과거에는 SQLite라는 데이터베이스 엔진을 이용해 데이터를 저장했으나 다음과 같은 단점이 있었다
SQLite의 문제점
한마디로 사용하기 어렵다는 뜻이다. Room은 이러한 문제들을 자동으로 처리할 수 있도록 도와주는 놈이다.
Room은 완전히 새로운 개념은 아니고, SQLite를 활용해서 객체 매핑을 해주는 역할을 한다.
아무튼 이러한 이유들로 구글에서는 SQLite 대신 Room을 사용할 것을 권장하고 있다.
1-2. Room 구조
Room 구조
위 사진에서 Room Database, Data Access Objects, Entities 이렇게 3개가 Room의 구성 요소이고
Rest of The App은 앱의 나머지 부분을 뜻한다.
각 요소에 대한 설명은 [목차 2]에서 다룰 예정이다.
1-3. TMI
정말 정말 간단한 정보를 저장할 경우를 생각해보자.
예를 들어 자동 로그인 여부를 저장하고 싶은데 고작 이 true/false 값을 저장하려고 Room을 사용하는 건 닭 잡는데 소 잡는 칼 쓰는 격이다. 별것도 아닌 거에 큰 노력을 들여야 한다는 것이다.
이럴 때는 Room이 아니라 sharedpreferences라는 것을 사용하면 된다.
반대로 대량의 데이터를 처리하게 될 경우는 Room보다 Realm을 사용하면 좋다. 속도도 빠르고 안정적이고 비동기 지원이 된다는 장점이 있으나 앱 용량이 커진다는 단점이 있어 상황에 맞게 사용하면 된다.
plugins 추가
plugins {
id 'kotlin-kapt'
}
dependencies 추가
//Room
implementation 'androidx.room:room-ktx:2.4.2'
kapt "androidx.room:room-compiler:2.4.2"
contracter
@Entity (엔터티_)
//Entity: 개체 라는 뜻
@Entity
data class ToDo(var title: String){
@PrimaryKey (autoGenerate = true)var id: Int =0
}
@DAO
@Dao
interface ToDoDao {
@Insert
fun insertAll(vararg toDo: ToDo)
@Update
fun update(toDo: ToDo)
@Delete
fun delete(toDo: ToDo)
@Query("SELECT * FROM ToDo")
fun getAll():List<ToDo>
}
@Database
@Database(entities = [ToDo::class], version = 1, exportSchema = false)
abstract class AppDatabase :RoomDatabase() {
abstract fun toDoDao(): ToDoDao
}
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
)
.allowMainThreadQueries() //메인쓰레드 허용
.build()
binding.tvText.text = db.toDoDao().getAll().toString()
binding.btnSave.setOnClickListener {
db.toDoDao().insertAll(ToDo(binding.etText.text.toString()))
binding.tvText.text = binding.etText.text.toString()
}
}
}
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"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/etText"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnSave"
android:text="save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tvText"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
참고
https://todaycode.tistory.com/39
안드로이드 Room의 사용법과 예제
1. Room 1-1. Room이란? 1-2. Room 구조 1-3. TMI 2. 사용법 2-1. gradle 2-2. Entity 2-3. DAO 2-4. Room Database 2-5. 데이터 베이스 사용 3. 예제 3-1. room + singleton + coroutine 3-..
todaycode.tistory.com
Room 라이브러리 사용하기 [3]
👍 SELECT문에 RxJava 적용하기 Dao Repository ViewModel View Flowable / Maybe / Single 셋 중 하나를 사용할 수 있는데 나는 값을 받아왔는지 못받아 왔는지만 확인하면 된다 판단하여 Single을 사용하였다. 해당
velog.io
'안드로이드' 카테고리의 다른 글
ViewFlipper 사용법(feat.Glide) (0) | 2022.01.12 |
---|---|
[Android/Kotlin ]Exoplayer 동적 playlist 만들기 (0) | 2022.01.10 |
[Android/ Java] ExoPlayer 로 동영상 재생하기 ! (0) | 2021.12.02 |
안드로이드 부트페이 API 카카오결제 사용! (JAVA) (2) | 2021.11.18 |
안드로이드 스튜디오 네이버 파파고 api 사용해보기! (Java) (0) | 2021.11.17 |