Kotlin에서 Room 사용하기
기본적으로 kapt를 추가로 기술할 뿐이지만 일부는 kotlin이 수월해지는 부분도 있기 때문에 룸은 반드시 koltin으로 해야 한다.
열심히 해설한 기사에게 지지만 실제 필요한 정도는 룸을 간단하게 접촉하고 어떻게 처리해야 할지 적는다.
Room?
Room Persistence Library 가져오기 및 번역
Android 프레임워크는 SQLite를 지원합니다. 이 녀석 자체는 강하지만 저층이기 때문에 능숙하게 사용하려면 노력이 필요합니다.
Room을 사용하면 터미널이 인터넷에 연결되어 있든 없든 캐시를 저장할 수 있습니다(인터넷 환경으로 복구할 때 동기화)
SQLite 쿼리는 컴파일할 때 검증되지 않기 때문에 필요할 때 (패턴 변경 등) 개발자가 쿼리를 변경해야 하기 때문에 오류의 원인이 되기 쉽다.
그리고 데이터 대상을 바꾸기 위해서는 예의 코드도 엉망진창으로 써야 한다.
룸에서는 이런 부분에 추상화층을 준비해 대응한다.
배치
gradlecompile "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"
kapt만 추가되었고, 다른 것은 자바와 같습니다.
룸 구성
참조 - AndroidDeveloper
세 가지 요소가 방을 구성했다.
gradle
compile "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"
kapt만 추가되었고, 다른 것은 자바와 같습니다.룸 구성
참조 - AndroidDeveloper
세 가지 요소가 방을 구성했다.
각자 호출을 준비하다.
엔티티를 준비하고 DataAcessObject(Dao)에서 작업을 설명합니다.
Entity @Entity
data class Address constructor(
@PrimaryKey(autoGenerate = true)
val id: Long,
val address: String,
val name: String
)
@Entity
이 클래스는 Annotation을 설정하여 데이터베이스에 저장된 엔티티가 됩니다.이 부근은 Realm과 같다.
또한 데이터 접근 대상에서 이 실체를 볼 수 있기 때문에 getter/setter를 준비해야 하지만 데이터 Object에서 생략할 수 있는 것이 장점이다.
객체는 하나여야 합니다@PrimaryKey
.autoGenerate
적절한 키를 발행합니다.
이번에는 안 썼어요.@ColumnInfo(name = "place_id") val id : Long
기다리면 SQL을 두드릴 때는 스네크의 상황이고, 실제로 코드를 쓸 때는 카멜을 사용할 수 있는 상황이다.
DateAccessObjects
코드가 길기 때문에 Dao로 기술합니다.@Dao
interface AddressDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun createAddress(address: Address)
@Query("SELECT * FROM Address")
fun findAll(): List<Address>
@Update
fun updateAddress(address: Address)
@Delete
fun delete(address: Address)
}
나는 다오를 써 보았다.
Annotation은 모두 4개입니다.
@Entity
data class Address constructor(
@PrimaryKey(autoGenerate = true)
val id: Long,
val address: String,
val name: String
)
@ColumnInfo(name = "place_id") val id : Long
코드가 길기 때문에 Dao로 기술합니다.
@Dao
interface AddressDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun createAddress(address: Address)
@Query("SELECT * FROM Address")
fun findAll(): List<Address>
@Update
fun updateAddress(address: Address)
@Delete
fun delete(address: Address)
}
나는 다오를 써 보았다.Annotation은 모두 4개입니다.
@Query
SQL 문장을 직접 기술할 수 있습니다.이번에는 findAll()
이니까 그런 SQL 글을 썼어요.과연 이 부분은 어쩔 수 없나요?인서트에는 가장할 때 지정할 수 있는 것이 5개라고 적혀 있습니다.
Datebase @Database(entities = arrayOf(AddressDao::class), version = 1)
abstract class DataBase : RoomDatabase() {
abstract fun addressDao(): AddressDao
}
array Of에 Dao를 추가하여 이 데이터베이스를 호출합니다.
매번 업데이트할 때마다 버전이 높아진다.또 다른 Dao가 추가될 때 여기에 추가됩니다.
데이터베이스 호출 class SampleApplication : Application() {
companion object {
lateinit var database: DataBase
}
override fun onCreate() {
super.onCreate()
database = Room.databaseBuilder(this, objectOf<DataBase>(), "kotlin_room_sample.db").build()
}
}
internal inline fun <reified T : Any> objectOf() = T::class.java
샘플이기 때문에 어플리케이션에 올려놓지만 정말 Dagger2 등으로 주입하면 테스트를 쓰기 쉽다고 생각합니다.
데이터 추가, 호출 및 삭제
그러면 응용 프로그램에 데이터베이스를 넣었기 때문에 호출해 보세요.
create
val dao = SampleApplication.database.addressDao()
async(UI) {
bg {
dao.createAddress(address)
}
}
말은 그렇지만 간단하다.
데이터베이스에서 가져온dao를 호출합니다. 이dao는 데이터베이스에서 방금 단일 설치 프로그램을 대체한 프로그램을 가져왔습니다.
따라서 룸도 UI 라인에서 실행할 수 있지만 일반적인 상황에서는 백그라운드에서 처리해야 하기 때문에 백그라운드에서create
참고로 UI 스레드에서 사용하고 싶은 경우 데이터베이스에 대해onConflict
하면 인기가 많아요.
query
private fun loadAddress() {
async(UI) {
val address: Deferred<List<Address>> = bg { getAddress() }
adapter.addItems(address.await())
adapter.notifyDataSetChanged()
resetEmptyView()
}
}
private fun getAddress(): List<Address> {
val dao = SampleApplication.database.addressDao()
return dao.findAll()
}
그리고 Query 메서드를 호출해 보십시오.
여기에서 목록에 저장된 모든 데이터를 가져옵니다.
kotlin은 async,await를 사용할 수 있기 때문에 효과적으로 기술할 수 있습니다.
룸이 도착하기를 기다리며 목록에 데이터가 표시됩니다.
delete
private fun deleteAddress(address: Address) {
async(UI) {
bg {
val dao = SampleApplication.database.addressDao()
dao.delete(address)
}
// UI操作
}
}
다음은 delete를 시도해 보세요.
여기도 bg delete로 할게요.단, 사용자 인터페이스 조작은 await가 아닙니다.사용자 인터페이스 조작을 기다리면 사용자가 잘 모르는 시간이 있기 때문이다.
여기서 마치겠습니다.
끝날 때
여기서 마치겠습니다.Room에서 혜택을 받을 수 있는 부분, Data object와 async, await를 쓴 후에 간단하게 스레드 관리를 쓸 수 있는 것은kotlin이다.
Reference
이 문제에 관하여(Kotlin에서 Room 사용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yukiyamadajp/items/73bffb6a3697cb62f9e1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
@Database(entities = arrayOf(AddressDao::class), version = 1)
abstract class DataBase : RoomDatabase() {
abstract fun addressDao(): AddressDao
}
class SampleApplication : Application() {
companion object {
lateinit var database: DataBase
}
override fun onCreate() {
super.onCreate()
database = Room.databaseBuilder(this, objectOf<DataBase>(), "kotlin_room_sample.db").build()
}
}
internal inline fun <reified T : Any> objectOf() = T::class.java
샘플이기 때문에 어플리케이션에 올려놓지만 정말 Dagger2 등으로 주입하면 테스트를 쓰기 쉽다고 생각합니다.데이터 추가, 호출 및 삭제
그러면 응용 프로그램에 데이터베이스를 넣었기 때문에 호출해 보세요.
create
val dao = SampleApplication.database.addressDao()
async(UI) {
bg {
dao.createAddress(address)
}
}
말은 그렇지만 간단하다.
데이터베이스에서 가져온dao를 호출합니다. 이dao는 데이터베이스에서 방금 단일 설치 프로그램을 대체한 프로그램을 가져왔습니다.
따라서 룸도 UI 라인에서 실행할 수 있지만 일반적인 상황에서는 백그라운드에서 처리해야 하기 때문에 백그라운드에서create
참고로 UI 스레드에서 사용하고 싶은 경우 데이터베이스에 대해onConflict
하면 인기가 많아요.
query
private fun loadAddress() {
async(UI) {
val address: Deferred<List<Address>> = bg { getAddress() }
adapter.addItems(address.await())
adapter.notifyDataSetChanged()
resetEmptyView()
}
}
private fun getAddress(): List<Address> {
val dao = SampleApplication.database.addressDao()
return dao.findAll()
}
그리고 Query 메서드를 호출해 보십시오.
여기에서 목록에 저장된 모든 데이터를 가져옵니다.
kotlin은 async,await를 사용할 수 있기 때문에 효과적으로 기술할 수 있습니다.
룸이 도착하기를 기다리며 목록에 데이터가 표시됩니다.
delete
private fun deleteAddress(address: Address) {
async(UI) {
bg {
val dao = SampleApplication.database.addressDao()
dao.delete(address)
}
// UI操作
}
}
다음은 delete를 시도해 보세요.
여기도 bg delete로 할게요.단, 사용자 인터페이스 조작은 await가 아닙니다.사용자 인터페이스 조작을 기다리면 사용자가 잘 모르는 시간이 있기 때문이다.
여기서 마치겠습니다.
끝날 때
여기서 마치겠습니다.Room에서 혜택을 받을 수 있는 부분, Data object와 async, await를 쓴 후에 간단하게 스레드 관리를 쓸 수 있는 것은kotlin이다.
Reference
이 문제에 관하여(Kotlin에서 Room 사용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yukiyamadajp/items/73bffb6a3697cb62f9e1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
val dao = SampleApplication.database.addressDao()
async(UI) {
bg {
dao.createAddress(address)
}
}
private fun loadAddress() {
async(UI) {
val address: Deferred<List<Address>> = bg { getAddress() }
adapter.addItems(address.await())
adapter.notifyDataSetChanged()
resetEmptyView()
}
}
private fun getAddress(): List<Address> {
val dao = SampleApplication.database.addressDao()
return dao.findAll()
}
private fun deleteAddress(address: Address) {
async(UI) {
bg {
val dao = SampleApplication.database.addressDao()
dao.delete(address)
}
// UI操作
}
}
여기서 마치겠습니다.Room에서 혜택을 받을 수 있는 부분, Data object와 async, await를 쓴 후에 간단하게 스레드 관리를 쓸 수 있는 것은kotlin이다.
Reference
이 문제에 관하여(Kotlin에서 Room 사용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yukiyamadajp/items/73bffb6a3697cb62f9e1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)