1. 본인이 사용하는 Room 방식에서 파일(모듈)은 아래와 같이 6개 필요하다.
2. 뷰모델 + 룸을 사용한다.
파일리스트
1> a4_Room_Dao
@Dao
interface
a4_Room_Dao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun add_viewstate(rep : a4_Room_Repository)
@Query("SELECT * FROM viewing_state Where type = :getype")
fun get_viewstate(getype : String) : Flowable<a4_Room_Repository>
@Query("DELETE FROM viewing_state")
fun clear_viewstate()
}
2>a4_Room_Database
//https://dybz.tistory.com/174
//배열 선언과 동시에 값들을 초기화할 경우, arrayOf(value) 함수를 사용하면 된다.
@Database(entities = [a4_Room_Repository::class], version = 1, exportSchema = false)
abstract class a4_Room_Database : RoomDatabase() { //RoomDatabase를 항상 상속해서 abstract class로 생성해야한다.
//데이터베이스와 연결할 데이터 접근 객체를 정의한다=> 이 객체를 통해 db에 접근하는 명령어를 생성할수있다. 왜냐하면 SearchHistoryDao가 @Dao를 사용해서 그 명령어들을 처리하는 클래스이기때문.
/***data access object 인 DAO를 저렇게 abstract fun으로 구현한다. 왜 그렇게 구현해야했는지 이유는 아직 알 필요없다.
* 저렇게 놓고 실행시키면 알아서 구현해주는 파일이 생긴다***/
abstract fun a4_Dao() : a4_Room_Dao
}
3>a4_Room_DatabaseProvider
private var instance: a4_Room_Database? = null
fun provide_a4Dao(context: Context): a4_Room_Dao = provide_Database(context).a4_Dao()
//싱글턴 패턴을 사용하여 인스턴스를 최초 1회만 생성한다.
private fun provide_Database(context : Context) : a4_Room_Database {
if(null == instance)
{
//simple_github.db 데이터베이스 파일을 사용하는 룸 데이터베이스를 생성한다.
instance = Room.databaseBuilder(context.applicationContext, a4_Room_Database::class.java, "a4room.db").build()
}
//룸 데이터베이스 인스턴스를 반환한다.
return instance!! //!!은 강제로 not null으로 바꾼다. 만약 값이 null이면 예외오류가 난다.
}
4>a4_Room_Repository
@Entity(tableName = "viewing_state")
data class a4_Room_Repository( //type은 "guestbook_viewing":게시글 확인여부/"guestbook_like":게시글 좋아요/"guestbook_like":게시글 싫어요를 구분한다.
// @PrimaryKey(autoGenerate = true) val prime_number: Int,
@PrimaryKey @SerializedName("idnumber") @ColumnInfo(name = "idnumber") val idnumber : String,
@SerializedName("type") @ColumnInfo(name = "type") val type : String,
@SerializedName("ischecked") @ColumnInfo(name = "ischecked") val ischecked : Boolean
)
5> a4_Viewmodel
class a4_Viewmodel (val a4roomdao: a4_Room_Dao) : ViewModel(){
//Cannot access database on the main thread since it may potentially lock the UI for a long period of time. 와 같은 문제 때문에 UI thread에서 실행할 수 없다. 따라서 runOnIoScheduler에서 dao동작이 실행되도록한다.
fun add_to_database(repository_dataclass : a4_Room_Repository): Disposable = runOnIoScheduler { a4roomdao.add_viewstate(repository_dataclass)}
fun fetch_from_database(type : String) : Disposable =
a4roomdao.get_viewstate(type) //api.searchRepository(query)는 옵저버블이다. => /** fun searchRepository(@Query("q") query: String): Observable<RepoSearchResponse> //옵저버블 타입변경**/
.observeOn(
AndroidSchedulers.mainThread()
) //스케줄러 교체
.doOnTerminate {
//isLoading.onNext(false)
}
.subscribe({ items ->
//repository.onNext(optionalOf(items))
})
{
//message.onNext(optionalOf(it.message ?: "Unexpected error"))
}
//Cannot access database on the main thread since it may potentially lock the UI for a long period of time. 와 같은 문제 때문에 UI thread에서 실행할 수 없다. 따라서 runOnIoScheduler에서 dao동작이 실행되도록한다.
fun allclear_database() = runOnIoScheduler {a4roomdao.clear_viewstate()}
}
6>a4_ViewmodelFactory
class a4_ViewmodelFactory(val a4dao: a4_Room_Dao) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
@Suppress("Unchecked_Cast")
return a4_Viewmodel(a4dao) as T
}
}
사용방법:
1> 메인에서
/************************************************************/
/** Room Database 연결 **/
/************************************************************/
lateinit var a4roomViewModel: a4_Viewmodel
val a4roomViewModelFactory by lazy { a4_ViewmodelFactory(provide_a4Dao(this)) }
2>onCreate에서
/**--------------------------------------------------------------------
----------------- ROOM database 사용 --------------------------------
--------------------------------------------------------------------* **/
/**뷰모델 가져오기**/
a4roomViewModel = ViewModelProviders.of(this, a4roomViewModelFactory)[a4_Viewmodel::class.java]
3. 호출방법
a4roomViewModel.allclear_database()