티스토리 뷰
SQLite 에서 ROOM 까지 (10) - SQLite 에서 ROOM 으로 migration 설정하기
parkho79 2020. 9. 21. 09:04이번 포스팅에서는 SQLite 에서 Room 으로 migration 설정에 대해 알아보자
참고로, 지난 포스팅 내용은 하단과 같다.
- UI, DB 생성, CRUD, column 추가, DB 확인
[Android/Database] - SQLite 에서 ROOM 까지 (2) - UI 구성
[Android/Database] - SQLite 에서 ROOM 까지 (3) - SQLiteOpenHelper
[Android/Database] - SQLite 에서 ROOM 까지 (4) - SQLite 를 이용한 CRUD
[Android/Database] - SQLite 에서 ROOM 까지 (5) - SQLite 로 생성된 기존 DB 에 column 추가하기
[Android/Database] - SQLite 에서 ROOM 까지 (6) - DB 확인하기
- ROOM, ROOM 의 3구성요소 추가, Repository, ViewModel 추가
[Android/Database] - SQLite 에서 ROOM 까지 (7) - ROOM 이란?
[Android/Database] - SQLite 에서 ROOM 까지 (8) - ROOM 의 3 구성요소(Database, Entity, Dao) 추가하기
Step 7: Migration 설정하기
◼ Version
SQLite 에서 Room 으로 migration 하기 위한 version 을 명시한다.
Room 은 SQLite 와 별도의 버전을 관리하지만 편의를 위해 SQLite 가 2 를 써서 3으로 설정했다.
(Room 부터는 새로운 버전으로 시작하고 싶다면 1 로 설정해도 된다.)
◼ Migration
해당 포스팅에서는 SQLite 에서 Room 으로 기존 data 를 유지한다는 조건으로 migration 을 하고 있다.
기존 data 를 유지하면서 Room 으로만 migration 한다면 아무것도 안 하고 addMigration 해주자.
(사실 아무것도 안 해줘도 한번에 성공하긴 힘들 것이다. 그 이유는 migration error 를 참조 하기 바란다.)
Migration error
SQLite 에서 Room 으로 migration 하면서 가장 힘들었던 부분이다.
분명히 Google guide 에서 기존 data 를 유지하면서 아무것도 안 바꾸고 그냥 SQLite 에서 Room 으로 migration 하면 empty migration 만 추가해 주면 된다고 했다.
그걸 믿고 진행했더니 아래와 같은 error 를 마주하게 됐다.
◼ IllegalStateException: Migration didn't properly handle student(com.parkho.sqlite.database.PhStudentEntity)
Exception 의 내용은 Room 에서 필요한 entity 와 migration 한 entity 가 다르다는 것이다.
Log 분석은 아래와 같이 Room SQLite Difference Finder 을 이용하자.
(그냥 눈으로 비교하기 힘들고 사용법도 간단히 copy & paste 만 하면 된다.)
기존 SQLite 프로젝트를 Room 으로 migration 하면 대부분 "notNull" 부분에서 오류가 날 것이다.
SQLite 에서는 "notNull" 항목을 신경쓰지 않았는데 (아마 default 가 false 였나보다.) Room 에서는 이게 틀리단다.
요것 때문에 empty migration 만 가지고는 대부분 에러가 날 것이다.
(참고로 다른 error 가 발생해도 RoomSQLiteDifferenceFinder 를 써서 틀린 부분을 똑같이 맞춰주면 해결된다.)
◼ Solution
가급적 empty migration 으로 진행하려 했지만 마땅한 해결책을 못 찾아 결국 migration 을 하단과 같이 수정했다.
1. 신규 table 생성
2. 기존 table 에서 신규 table 로 data copy
3. 기존 table 삭제
4. 신규 table 이름을 기존 table 이름으로 변경
Source code
https://github.com/parkho79/FromSQLiteToRoom_3
'Android > Database' 카테고리의 다른 글
SQLite 에서 ROOM 까지 (12) - ROOM 에 LiveData 적용하기 (0) | 2020.10.08 |
---|---|
SQLite 에서 ROOM 까지 (11) - ROOM 을 이용한 CRUD (0) | 2020.10.05 |
SQLite 에서 ROOM 까지 (9) - Architecture Components 구성을 위한 Repository, ViewModel 추가하기 (0) | 2020.09.15 |
SQLite 에서 ROOM 까지 (8) - ROOM 의 3 구성요소(Database, Entity, Dao) 추가하기 (0) | 2020.09.09 |
SQLite 에서 ROOM 까지 (7) - ROOM 이란? (0) | 2020.09.01 |
- Total
- Today
- Yesterday
- StartService
- 리워드앱
- Android Service
- bindservice
- android activity flag
- registerForContextMenu
- WEMIX
- 앱테크 추천
- 무료채굴
- Intent
- M2E
- 리워드 어플
- BroadcastReceiver
- 안드로이드 인텐트
- android task
- android intent
- onContextItemSelected
- onCreateContextMenu
- p2e
- 안드로이드 서비스
- 앱테크
- notifyDataSetChanged
- StringUtils
- android flag activity
- task
- 채굴앱
- task 생성
- mPANDO
- 무료 채굴
- RoomDatabase
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |