( 주의 ) 혼자 공부하고 이해한 것을 정리해본 것 입니다. 여기저기에서 많이 참조하여 다소 두서없을 수 있습니다 !
Room 지속성 라이브러리는 SQLite에 추상화 레이어를 제공하여 SQLite를 완벽히 활용하면서 더 견고한 데이터베이스 액세스를 가능하게 합니다.
by android developer
다음과 같이 Room을 정의하고 있다. 즉, SQLlite를 직접적으로 사용하지 않고 Room이라는 라이브러리를 통해서 SQLite를 사용하는 것이다.
그렇다면, 직접적으로 Room 대신에 SQLite를 사용해도 되는데,
왜 다른 라이브러리를 사용하는 것일까?
상당한 양의 구조화된 데이터를 처리하는 앱은 데이터를 로컬로 유지하여 대단한 이점을 얻을 수 있습니다. 가장 일반적인 사용 사례는 관련 데이터를 캐싱하는 것입니다. 이런 방식으로 기기가 네트워크에 액세스할 수 없을 때 오프라인 상태인 동안에도 사용자가 여전히 콘텐츠를 탐색할 수 있습니다. 나중에 기기가 다시 온라인 상태가 되면 사용자가 시작한 콘텐츠 변경사항이 서버에 동기화됩니다.
by android developer
즉, 온, 오프라인 상관없이 database를 사용하고 싶기 때문이다 !
이제 부터 어떻게 사용하는지에 대해 깊게 파고들겠다.
@Entity(tableName = "user_table")
data class User(
@PrimaryKey(autoGenerate = true) var userid: Int?,
@ColumnInfo(name = "devicenum") var devicenum: Int?
)
user_table이라는 이름을 가진 entity를 만들었다.
User table에서는 @primarykey로 userid를 갖고있고 없다면
autoGenerate(자동생성)하도록 만들었다.
그 외의 열은 @ColumnInfo로 정의하였다. devicenum같은 경우
Int형을 갖고있는 열이다.
interface UserDao {
@Insert
fun addUser(user:User)
@Query("SELECT * FROM user_table ORDER BY userid ASC")
fun readAllData(): LiveData<List<User>>
@Delete
fun delete(user:User)
}
user table에서 사용하고 싶은 쿼리를 inteface userdao에 사용한다.
기존 쿼리문 처럼 @Query를 통해 SELECT문을 사용할 수 있다.
또한 WHERE문을 사용하여 특정 id를 지정하여 쿼리를 생성할 수도 있는데 이때 특정 id는 :id와 같이 표시하고 함수의 메개변수로 받으면 된다
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase: RoomDatabase() {
abstract fun userDao():UserDao
companion object {
@Volatile
private var INSTANCE: UserDatabase? = null
fun getDatabase(context: Context): UserDatabase{
val tempInstance = INSTANCE
if(tempInstance != null){
return tempInstance
}
synchronized(this){
val instance = Room.databaseBuilder(
context.applicationContext,
UserDatabase::class.java,
"user_database"
).build()
INSTANCE = instance
return instance
}
}
}
}
데이터 베이스와 연결시켜주는 class이다.
반드시 RoomDatabase를 확장 해야한다. 그리고 databasebuilder에서
synchronized(this){
val instance = Room.databaseBuilder(
context.applicationContext,
UserDatabase::class.java,
"user_database"
).build()
INSTANCE = instance
return instance
이 부분을 통해 database class와 entity를 연결시켜준다