Room
최근 업데이트 | 안정화 버전 | 출시 후보 버전 | 베타 버전 | 알파 버전 |
---|---|---|---|---|
2024년 8월 7일 | 2.6.1 | - | - | 2.7.0-alpha06 |
종속 항목 선언
Room의 종속 항목을 추가하려면 프로젝트에 Google Maven 저장소를 추가해야 합니다. 자세한 내용은 Google Maven 저장소를 읽어보세요.
Room의 종속 항목에는 Room 이전 테스트 및 Room RxJava가 포함됩니다.
다음과 같이 앱 또는 모듈의 build.gradle
파일에 필요한 아티팩트의 종속 항목을 추가합니다.
Groovy
dependencies { def room_version = "2.6.1" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" // To use Kotlin annotation processing tool (kapt) kapt "androidx.room:room-compiler:$room_version" // To use Kotlin Symbol Processing (KSP) ksp "androidx.room:room-compiler:$room_version" // optional - RxJava2 support for Room implementation "androidx.room:room-rxjava2:$room_version" // optional - RxJava3 support for Room implementation "androidx.room:room-rxjava3:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture implementation "androidx.room:room-guava:$room_version" // optional - Test helpers testImplementation "androidx.room:room-testing:$room_version" // optional - Paging 3 Integration implementation "androidx.room:room-paging:$room_version" }
Kotlin
dependencies { val room_version = "2.6.1" implementation("androidx.room:room-runtime:$room_version") annotationProcessor("androidx.room:room-compiler:$room_version") // To use Kotlin annotation processing tool (kapt) kapt("androidx.room:room-compiler:$room_version") // To use Kotlin Symbol Processing (KSP) ksp("androidx.room:room-compiler:$room_version") // optional - Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:$room_version") // optional - RxJava2 support for Room implementation("androidx.room:room-rxjava2:$room_version") // optional - RxJava3 support for Room implementation("androidx.room:room-rxjava3:$room_version") // optional - Guava support for Room, including Optional and ListenableFuture implementation("androidx.room:room-guava:$room_version") // optional - Test helpers testImplementation("androidx.room:room-testing:$room_version") // optional - Paging 3 Integration implementation("androidx.room:room-paging:$room_version") }
KAPT 플러그인 사용에 관한 자세한 내용은 KAPT 문서를 참고하세요.
KSP 플러그인 사용에 대한 자세한 내용은 KSP 빠른 시작 문서를 참조하세요.
Kotlin 확장 프로그램 사용에 관한 정보는 ktx 문서를 참고하세요.
종속 항목에 관한 자세한 내용은 빌드 종속 항목 추가를 참고하세요.
선택사항으로 Android가 아닌 라이브러리(예: 자바 또는 Kotlin 전용 Gradle 모듈)의 경우 Room 주석을 사용하도록 androidx.room:room-common
을 사용할 수 있습니다.
컴파일러 옵션 구성
Room에는 다음과 같은 주석 프로세서 옵션이 있습니다.
room.schemaLocation |
directory
데이터베이스 스키마를 JSON 파일로 내보내기 디렉터리 Room 이전을 참조하세요. 를 참조하세요. |
room.incremental |
boolean
Gradle 증분 주석 프로세서를 사용 설정합니다. 기본값 true 입니다.
|
room.generateKotlin |
boolean
Java 대신 Kotlin 소스 파일을 생성합니다. KSP가 필요합니다. 기본값은 false 입니다.
자세한 내용은 버전 2.6.0 메모를 참조하세요.
|
Room Gradle 플러그인 사용
Room 버전 2.6.0 이상에서 Room Gradle 플러그인을 사용하여 Room 컴파일러의 옵션을 구성합니다. 플러그인은 다음과 같은 프로젝트를 구성합니다. 인코더-디코더에 의해 생성된 스키마 (컴파일 작업의 출력이며 는 재현 가능하고 올바르게 구성되도록 캐시 가능한 빌드
플러그인을 추가하려면 최상위 Gradle 빌드 파일에서 확인할 수 있습니다
Groovy
plugins { id 'androidx.room' version "$room_version" apply false }
Kotlin
plugins { id("androidx.room") version "$room_version" apply false }
모듈 수준 Gradle 빌드 파일에서 플러그인을 적용하고 room
를 사용합니다.
확장자가 포함됩니다.
Groovy
plugins { id 'androidx.room' } android { ... room { schemaDirectory "$projectDir/schemas" } }
Kotlin
plugins { id("androidx.room") } android { ... room { schemaDirectory("$projectDir/schemas") } }
Room Gradle 플러그인을 사용할 때는 schemaDirectory
를 설정해야 합니다. 이
Room 컴파일러와 다양한 컴파일 작업, 백엔드를 구성합니다.
(javac, KAPT, KSP) - 스키마 파일을 버전 지정 폴더에 출력
schemas/flavorOneDebug/com.package.MyDatabase/1.json
이러한 파일은
유효성 검사 및 자동 이전에 사용할 저장소에 체크인했습니다.
일부 옵션은 모든 버전의 Room Gradle 플러그인에서 구성할 수 없습니다.
이는 Room 컴파일러에서 지원되기 때문입니다. 아래 표에는
옵션을 표시하고,
room
확장 프로그램을 사용하여 해당 옵션을 구성합니다. 버전이 낮은 경우
또는 옵션이 아직 지원되지 않는 경우
주석 프로세서 옵션을 대신 사용합니다.
옵션 | 버전 이후 |
---|---|
room.schemaLocation (필수 항목) |
2.6.0 |
room.incremental |
- |
room.generateKotlin |
- |
주석 프로세서 옵션 사용
Room Gradle 플러그인을 사용하지 않거나 원하는 옵션이 지원하는 경우 다음 명령어를 사용하여 Room을 구성할 수 있습니다. 주석 프로세서 옵션 빌드 종속 항목을 추가합니다. 어떻게 Room에 KSP를 사용하는지 KAPT를 사용하는지에 따라 주석 옵션을 지정할 수 있습니다.
Groovy
// For KSP ksp { arg("option_name", "option_value") // other otions... } // For javac and KAPT android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments += [ "option_name":"option_value", // other options... ] } } } }
Kotlin
// For KSP ksp { arg("option_name", "option_value") // other options... } // For javac and KAPT android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments += mapOf( "option_name" to "option_value", // other options... ) } } } }
room.schemaLocation
는 기본 유형이 아닌 디렉터리이므로
이 옵션을 추가할 때 CommandLineArgumentsProvider
를 사용해야 하므로
Gradle이 이 디렉터리에 관해 알고 있는 정보를
저장하는 데 사용됩니다
Room 데이터베이스 이전
다음을 제공하는 CommandLineArgumentsProvider
의 온전한 구현을 보여줍니다.
스키마 위치를 지정합니다
의견
제출하신 의견은 Jetpack을 개선하는 데 도움이 됩니다. 새로운 문제를 발견하거나 라이브러리 개선을 위한 아이디어가 있다면 Google에 알려 주세요. 새 문제를 제출하기 전에 이 라이브러리의 기존 문제를 살펴보시기 바랍니다. 별표 버튼을 클릭하여 기존 문제에 투표할 수 있습니다.
자세한 내용은 Issue Tracker 문서를 참고하세요.
버전 2.7
버전 2.7.0-alpha06
2024년 8월 7일
androidx.room:room-*:2.7.0-alpha06
이 출시되었습니다. 버전 2.7.0-alpha06에 포함된 커밋을 확인하세요.
API 변경사항
- KMP 프로젝트에서
RoomDatabase
의 인스턴스화 설정을 변경합니다.
Kotlin 2.0 컴파일 모델로 인해, 생성될 함수인 instantiateImpl()
를 참조하는 전략은 더 오래 실행 가능합니다. instantiateImpl()
전략을 대체하는 두 가지 새로운 API인 @ConstructedBy
및 RoomDatabaseConstructor
가 도입되었습니다. 새로운 전략은 다음과 같습니다.
RoomDatabaseConstructor
를 구현하는 예상 객체 정의expect object MyDatabaseCtor : RoomDatabaseConstructor<MyDatabase>
@ConstructedBy
를 사용하여 객체를@Database
선언과 연결합니다.@Database(...) @ConstructedBy(MyDatabaseCtor::class) // NEW abstract class MyDatabase : RoomDatabase
팩토리 인수를 전달하지 않고 새 데이터베이스 인스턴스를 만듭니다.
fun createNewDatabase(path: String) = Room.databaseBuilder<AppDatabase>(name = path) .setDriver(BundledSQLiteDriver()) .setQueryCoroutineContext(Dispatchers.IO) .build()
b/316978491이 수정되었습니다. b/338446862 및 (b/342905180)
- Room KMP에서
@RawQuery
를 지원합니다. 이를 위해 원시 SQL 문자열과 인수를 문에 결합하는 함수를 유지하는 측면에서SupportSQLiteQuery
와 유사한 새 API인RoomRawQuery
를 추가합니다.@RawQuery
주석이 달린 함수는 이제RoomRawQuery
를 단일 매개변수로 허용할 수 있습니다. 추가했습니다. (Iea844, b/330586815) CoroutineContext
를 허용하는setQueryCallback()
오버로드를 추가합니다. 추가합니다. (Id66ff, b/309996304)linuxArm64
Kotlin 멀티플랫폼 타겟에 관한 지원이 추가되었습니다. (I139d3, b/338268719)
버그 수정
- Room이 Android가 아닌 타겟에서
recursiveFetchArrayMap
호출을 잘못 생성하는 문제를 수정했습니다. 추가했습니다. (710c36, b/352482325) - Room에서 가끔 KMP 프로젝트의 'Timed out into connection'에 관한 예외를 발생시키는 문제를 수정했습니다. (fa72d0, b/347737870)
- 다른 테이블이 새 외래 키를 준수하도록 스키마를 변경하기 전에 너무 일찍 외래 키를 확인하는 자동 이전 문제를 수정합니다. 추가했습니다. (7672c0, b/352085724)
버전 2.7.0-alpha05
2024년 7월 10일
androidx.room:room-*:2.7.0-alpha05
이 출시되었습니다. 버전 2.7.0-alpha05에 포함된 커밋을 확인하세요.
API 변경사항
SQLiteKt
의 이름이SQLite
으로,BundledSQLiteKt
의 이름이BundledSQLite
으로 변경되었습니다. 추가했습니다. (I8b501)
버그 수정
AndroidSQLiteDriver
를 사용할 때RoomDatabase
가 교착 상태 또는 연결 시간 초과와 함께 오류가 발생하는 버그를 수정했습니다.
버전 2.7.0-alpha04
2024년 6월 12일
androidx.room:room-*:2.7.0-alpha04
이 출시되었습니다. 버전 2.7.0-alpha04에 포함된 커밋을 확인하세요.
버그 수정
- DAO에 멀티 맵 반환 유형이 정의되었을 때 Room의 주석 프로세서가 호환되지 않는 KMP 코드를 생성하는 문제를 수정했습니다. b/340983093을 참조하세요.
@Database
주석이 달린 클래스에 패키지가 없는 경우 Room에서 생성된 데이터베이스 구현을 찾지 못하는 문제를 수정했습니다. b/342097292를 참조하세요.- 데이터베이스가 유휴 상태로 인해 자동 닫힐 때 자동 닫기 및 멀티 인스턴스 무효화를 사용 설정하면 가끔
ConcurrentModificationException
이 발생하는 문제를 수정했습니다.
버전 2.7.0-alpha03
2024년 5월 29일
androidx.room:room-*:2.7.0-alpha03
이 출시되었습니다. 버전 2.7.0-alpha03에 포함된 커밋을 확인하세요.
버그 수정
- Kotlin 2.0 및 KSP 2.0과 관련된 다양한 문제를 수정합니다. KSP 2를 지원하는 Kotlin 2.0은 완전하지 않으며 팀에서는 새로운 컴파일러의 다양한 API와 동작 변경사항 관련 작업을 진행하고 있습니다. b/314151707을 참조하세요.
버전 2.7.0-alpha02
2024년 5월 14일
androidx.room:room-*:2.7.0-alpha02
이 출시되었습니다. 버전 2.7.0-alpha02에 포함된 커밋을 확인하세요.
버그 수정
- 다양한 KSP 문제가 수정되었습니다.
버전 2.7.0-alpha01
2024년 5월 1일
androidx.room:room-*:2.7.0-alpha01
이 출시되었습니다. 버전 2.7.0-alpha01에 포함된 커밋을 확인하세요.
새로운 기능
- Kotlin 멀티플랫폼 (KMP) 지원: 이번 출시에서 Room은 Kotlin 멀티플랫폼 (KMP) 라이브러리가 되도록 리팩터링되었습니다. 아직 해야 할 작업이 남아 있지만, 이번 출시에서는 대부분의 기능이 '공통화'된 새로운 Room 버전(멀티플랫폼으로 제작됨)을 도입합니다. 현재 지원되는 플랫폼은 Android, iOS, JVM (데스크톱), 네이티브 Mac, 네이티브 Linux입니다. 새로 지원되는 플랫폼에서 누락된 기능은 향후 Room 출시에서 '기능 완성'이 될 예정입니다.
Room KMP를 사용하는 방법에 관한 자세한 내용은 공식 Room KMP 문서를 참고하세요.
- KSP에서 Kotlin 코드 생성은 KSP를 통해 처리되는 경우 기본적으로 사용 설정됩니다. KAPT 또는 Java 전용 프로젝트의 경우 Room은 여전히 Java 소스를 생성합니다.
API 변경사항
- 생성된
RoomDatabase
구현을 인스턴스화할 때 리플렉션 사용을 방지하기 위해 Room 생성 함수와 함께 사용할 람다 매개변수를 사용하는Room.databaseBuilder()
오버로드가 추가되었습니다. 사용 예시는 다음과 같습니다.
Room.databaseBuilder<MyDatabase>(
context = appContext,
name = dbFilePath,
factory = { MyDatabase::class.instantiateImpl() }
)
CoroutineContext
로 Room을 구성하는 API가 빌더RoomDatabase.Builder.setQueryCoroutineContext
에 추가되었습니다.RoomDatabase
는setQueryExecutor
를 사용하는 실행자 또는 코루틴 컨텍스트를 사용하는 실행자 중 하나로만 구성할 수 있지만 둘 다로 구성할 수는 없습니다.SQLite
드라이버로 Room을 구성하는 APIRoomDatabase.Builder.setDriver()
가 추가되었습니다.SQLite
Driver API에 관한 자세한 내용은 SQLite KMP 문서를 참고하세요.- 드라이버 API에서 기본
SQLiteConnection
에 액세스하기 위한 APIRoomDatabase.useReaderConnection
및RoomDatabase.useWriterConnection
가 추가되었습니다. - 이제 Varios Room 관련 콜백에
SupportSQLiteDatabase
대신SQLiteConnection
를 수신하는 오버로드된 버전이 있습니다. KMP 프로젝트로 이전할 때 재정의하기 위한 것입니다. Android 앱의 Room 사용을 일반 KMP 모듈로 이전하는 방법에 관한 자세한 내용은 이전 가이드를 참고하세요. 콜백은 다음과 같습니다. <ph type="x-smartling-placeholder">- </ph>
Migration.migrate(SQLiteConnection)
AutoMigrationSpec.onPostMigrate(SQLiteConnection)
RoomDatabase.Callback.onCreate(SQLiteConnection)
RoomDatabase.Callback.onDestructiveMigration(SQLiteConnection)
RoomDatabase.Callback.onOpen(SQLiteConnection)
- KTX 아티팩트
androidx.room:room-ktx
가 모든 API와 함께androidx.room:room-runtime
에 병합되어 이제 아티팩트가 비어 있습니다. 종속 항목 목록에서 이를 삭제하세요.
버전 2.6
버전 2.6.1
2023년 11월 29일
androidx.room:room-*:2.6.1
이 출시되었습니다. 버전 2.6.1에 포함된 커밋을 확인하세요.
버그 수정
- 생성된 코드에서
EntityCursorConverter
에 있는 Double 열의 기본값이 0.0이 아닌 0으로 설정되는 문제가 해결되었습니다. 부동 소수점 수 유형 열의 유사한 에지 케이스(edge case)에 대한 잠재적인 수정사항도 포함되었습니다. 추가했습니다. (Id75f5, b/304584179) - 이제
PagingSource
로드에서 발생한 예외가 Throwable을 포함하는LoadResult.Error
의LoadStateUpdate
로 전파됩니다. 이 오류 상태는PagingDataAdapter.loadStateFlow(Views)
또는LazyPagingItems.loadState(Compose)
를 통해 관찰할 수 있습니다. 이는 이전의 로드 오류가 로드를 트리거한 dao 메서드에 의해 발생한 예외로 표시되는 동작 변경을 나타냅니다. 추가했습니다. (I93887, b/302708983)
버전 2.6.0
2023년 10월 18일
androidx.room:room-*:2.6.0
이 출시되었습니다. 버전 2.6.0에 포함된 커밋을 확인하세요.
2.5.0 이후 중요 변경사항
- 이제 Room KSP에서 Kotlin 코드 생성 (또는 'Kotlin CodeGen')을 사용 설정할 수 있습니다. (4297ec0) Room에서 Kotlin CodeGen을 사용 설정하려면 KSP의 프로세서 옵션에
room.generateKotlin
옵션 이름을 추가합니다. KSP의 프로세서 옵션을 전달하는 방법에 관한 자세한 내용은 KSP 문서를 참고하세요.
참고: Kotlin CodeGen을 사용할 때는 추가된 제한사항이 있습니다. Kotlin CodeGen에서 DAO getter 또는 DAO 쿼리와 같은 추상 속성은 허용되지 않으며, 속성 값이 변경 불가능하고 고정된 저장 결과가 있다는 잘못된 개념을 방지하기 위해 함수로 다시 작성되어야 합니다. 추가된 또 다른 제한사항은 Room for Kotlin CodeGen에서 더 이상 null을 허용하는 컬렉션 반환 유형이 허용되지 않는다는 것입니다.
경고: Kotlin CodeGen을 사용할 때 프로젝트의 null 허용 여부가 더 엄격할 수 있습니다. Kotlin CodeGen에서는 유형 인수의 null 허용 여부가 중요하지만 Java에서는 거의 무시됩니다. 예를 들어 `Flow<foo\>` 반환 유형이 있고 테이블이 비어 있다고 가정해 보겠습니다. Java CodeGen에서는 이로 인해 문제가 발생하지 않지만 Kotlin CodeGen에서는 오류가 발생합니다. 이를 방지하려면 null이 방출된다고 가정하여 `Flow<foo?\>`를 사용해야 합니다. </foo?\></foo\>
- Room Gradle 플러그인의 새로운 아티팩트가 ID가
androidx.room
인 Room에 추가되었습니다. 이를 통해 Gradle 주석 프로세서 옵션을 통해 스키마의 입력 및 출력과 관련하여 Room의 다양한 기존 문제를 해결합니다. 자세한 내용은 Room 버전 2.6.0-alpha02 출시 노트를 참고하세요. - 이제 KSP에서 Room 항목의 값 클래스가 지원됩니다. (4194095)
- 이제 DAO 함수의 중첩된 지도 반환 유형이 Room에서 지원됩니다. 추가했습니다. (I13f48, 203008711)
버전 2.6.0-rc01
2023년 9월 20일
androidx.room:room-*:2.6.0-rc01
이 출시되었습니다. 버전 2.6.0-rc01에 포함된 커밋을 확인하세요.
버전 2.6.0-beta01
2023년 8월 23일
androidx.room:room-*:2.6.0-beta01
이 출시되었습니다. 버전 2.6.0-beta01에 포함된 커밋을 확인하세요.
버그 수정
- upsert 중에
2067 SQLITE_CONSTRAINT_UNIQUE
예외가 발생할 때 발생하는 upsert 중에 특수한 사례SQLite
예외를 처리하면 upsert가 업데이트를 실행해야 합니다. 추가했습니다. (If2849, b/243039555)
버전 2.6.0-alpha03
2023년 8월 9일
androidx.room:room-*:2.6.0-alpha03
이 출시되었습니다. 버전 2.6.0-alpha03에 포함된 커밋을 확인하세요.
새로운 기능
API 변경사항
- 현재 지원 중단된
@MapInfo
를 대체하기 위해@MapColumn
라는 새로운 유형 주석이 생성되었습니다.@MapInfo
주석에 제공된 각 열 이름 (keyColumnName
,valueColumnName
또는 둘 다)의 경우columnName
만 사용하여@MapColumn
주석을 선언하고 DAO 함수의 반환 유형에서 참조되는 특정 유형 인수 (맵의 키 또는 값)에 주석을 사용해야 합니다.@MapColumn
주석이@MapInfo
와 같은 함수 자체가 아닌 DAO 함수의 반환 유형 내 유형 인수에 직접 사용되기 때문입니다. 자세한 내용은@MapColumn
문서를 참고하세요. 추가했습니다. (Ib0305, b/203008711) - 호환성 억제에 주석을 달도록 API 파일을 업데이트했습니다. (I8e87a, b/287516207)
- Room Gradle 플러그인 API가 항상 변형별 구성이 필요하지는 않도록 업데이트되었습니다. 다시 말해, 플러그인이 여러 디렉터리를 생성하지 않고도 모든 변형에 대해 전역 위치를 허용할 수 있으므로 더 원활한 마이그레이션이 가능하지만 버전 또는 빌드 유형 스키마를 수동으로 구성할 수 있을 만큼 유연하며, 여전히 플러그인의 이점 (재현 및 캐시 가능한 빌드)을 유지합니다. 추가했습니다. (I09d6f, b/278266663)
버그 수정
QueryInterceptorStatement
의 잠재적인 메모리 누수 취약점이 수정되었습니다. 추가했습니다. (I193d1)QueryInterceptorDatabase execSQL()
함수의 잘못된 동작을 수정했습니다. 추가했습니다. (Iefdc8)
버전 2.6.0-alpha02
2023년 6월 21일
androidx.room:room-*:2.6.0-alpha02
이 출시되었습니다. 버전 2.6.0-alpha02에 포함된 커밋을 확인하세요.
Room Gradle 플러그인
이 새로운 버전에는 ID가 androidx.room
인 Room Gradle 플러그인의 새로운 아티팩트가 포함되어 있습니다. 이 아티팩트는 Gradle 주석 프로세서 옵션을 통해 스키마의 입력 및 출력과 관련하여 Room의 다양한 기존 문제를 해결합니다. Room Gradle 플러그인은 자동 이전에 사용되고 컴파일 작업의 출력인 생성된 스키마가 재현 가능하고 캐시 가능한 빌드를 갖도록 올바르게 구성되도록 프로젝트를 구성합니다. 플러그인은 기본 스키마 위치를 구성하는 DSL을 제공합니다.
room {
schemaDirectory("$projectDir/schemas/")
}
그러면 플러그인은 Room 컴파일러, 다양한 컴파일 작업, 백엔드(javac, KAPT, KSP)를 구성하여 스키마 파일을 버전 지정 폴더(예: schemas/flavorOneDebug/com.package.MyDatabase/1.json
)에 출력합니다. 평소와 같이 이러한 파일은 유효성 검사 및 자동 이전에 사용할 저장소에 체크인됩니다. 주석 프로세서 옵션 대신 플러그인을 사용하도록 이전할 때 기존 스키마 파일을 플러그인에서 만든 생성된 버전 디렉터리에 복사해야 합니다. 이 작업은 수동으로 실행해야 하는 일회성 이전 작업입니다. 의견이 해결되고 플러그인이 안정화되면 향후 developers.android.com의 스키마 문서가 업데이트될 예정입니다.
API 변경사항
RoomDatabase.QueryCallback
는 SAM 변환 사용을 허용하는 기능 인터페이스로 정의되었습니다. 추가했습니다. (Iab8ea, b/281008549)
버그 수정
- Room 소스를 Java에서 Kotlin으로 이전한 후 Robolectric에서 데이터베이스를 인스턴스화할 때 발생하는 문제를 해결했습니다. 추가했습니다. (Ic053c, b/274924903)
버전 2.6.0-alpha01
2023년 3월 22일
androidx.room:room-*:2.6.0-alpha01
이 출시되었습니다. 버전 2.6.0-alpha01에 포함된 커밋을 확인하세요.
새로운 기능
- KSP용 Room의 값 클래스 지원 이제 Room이 항목의 값 클래스를 지원할 수 있습니다. (4194095)
- 이제 Room(4297ec0)에서 Kotlin 코드 생성 (또는 'Kotlin CodeGen')을 사용 설정할 수 있습니다. Room에서 Kotlin CodeGen을 사용 설정하려면 KSP의 프로세서 옵션에
room.generateKotlin
옵션 이름을 추가합니다. KSP의 프로세서 옵션을 전달하는 방법에 관한 자세한 내용은 KSP 문서를 참고하세요.
참고: Kotlin CodeGen을 사용할 때는 추가된 제한사항이 있습니다. Kotlin CodeGen에서 DAO getter 또는 DAO 쿼리와 같은 추상 속성은 허용되지 않으며, 속성 값이 변경 불가능하고 고정된 저장 결과가 있다는 잘못된 개념을 방지하기 위해 함수로 다시 작성되어야 합니다. 추가된 또 다른 제한사항은 Room for Kotlin CodeGen에서 더 이상 null을 허용하는 컬렉션 반환 유형이 허용되지 않는다는 것입니다.
경고: Kotlin CodeGen을 사용할 때 프로젝트의 null 허용 여부가 더 엄격할 수 있습니다. Kotlin CodeGen에서는 유형 인수의 null 허용 여부가 중요하지만 Java에서는 거의 무시됩니다. 예를 들어 `Flow<foo\>` 반환 유형이 있고 테이블이 비어 있다고 가정해 보겠습니다. Java CodeGen에서는 이로 인해 문제가 발생하지 않지만 Kotlin CodeGen에서는 오류가 발생합니다. 이를 방지하려면 null이 방출된다고 가정하여 `Flow<foo?\>`를 사용해야 합니다. </foo?\></foo\>
API 변경사항
- DAO 메서드 반환 유형에서 null을 허용하는 컬렉션을 무의미하게 사용하지 않도록 보호합니다. 추가합니다. (I777dc, b/253271782, b/259426907)
- 무효화 추적기 변경사항을 내보내는 Flow를 만들기 위한 API를 추가합니다. 이 API는 데이터베이스 변경사항에 반응해야 하는 스트림을 만드는 데 유용합니다. 추가했습니다. (I8c790, b/252899305)
버그 수정
- Kotlin 코드 생성에서 DAO getter 또는 DAO 쿼리로 추상 속성을 허용하지 않습니다. 대신 속성 값을 변경할 수 없으며 고정된 저장 결과가 있다는 거짓 개념을 방지하기 위해 함수로 다시 작성해야 합니다. (If6a13, b/127483380, b/257967987)
버전 2.5.2
버전 2.5.2
2023년 6월 21일
androidx.room:room-*:2.5.2
이 출시되었습니다. 버전 2.5.2에 포함된 커밋을 확인하세요.
버그 수정
- kotlinx-metadata-jvm과의 비호환성 문제를 수정합니다. 추가했습니다. (386d5c)
- Room을 Robolectric 테스트에서 사용할 때 오류가 발생하는 문제를 수정합니다. 추가했습니다. (f79bea, b/274924903)
버전 2.5.1
버전 2.5.1
2023년 3월 22일
androidx.room:room-*:2.5.1
이 출시되었습니다. 버전 2.5.1에 포함된 커밋을 확인하세요.
버그 수정
- 데이터베이스가 이미 열려 있으면
FrameworkSQLiteHelper
에서 데이터베이스 상위 디렉터리를 확인하지 않습니다. 추가했습니다. (5de86b8) - 데이터베이스가 이미 열려 있는지 확인할 때
isOpenInternal
검사를 사용합니다. 추가했습니다. (e91fb35) - 이제 Room의
acquireTransactionThread()
에서 재진입 케이스를 더 효과적으로 처리할 수 있습니다. (219f98b) 정지 트랜잭션 중에 Room은 트랜잭션 실행자의 스레드를 사용하고 여기에서 이벤트 루프를 시작하며 정지 데이터베이스 작업을 이 스레드로 전달하므로 모두 트랜잭션 코루틴 내에 캡슐화됩니다. 일반적으로 트랜잭션 스레드는 트랜잭션을 시작하는 스레드와 다를 것으로 예상되지만 어떤 경우에는 동일합니다. 이러한 재진입 사례를 처리하기 위해withTransaction()
는 더 이상 제어 작업에 의존하지 않도록 리팩터링되었으며 대신 트랜잭션 스레드의runBlocking
내에서 정지 트랜잭션 블록을 실행합니다.
버전 2.5.0
버전 2.5.0
2023년 2월 22일
androidx.room:room-paging-guava:2.5.0
, androidx.room:room-paging-rxjava2:2.5.0
, androidx.room:room-paging-rxjava3:2.5.0
이 출시되었습니다. 버전 2.5.0에 포함된 커밋을 확인하세요.
버전 2.5.0
2023년 1월 11일
androidx.room:room-*:2.5.0
이 출시되었습니다. 버전 2.5.0에 포함된 커밋을 확인하세요.
2.4.0 이후 중요 변경사항
- 모든
room-runtime
소스가 자바에서 Kotlin으로 변환되었습니다. Kotlin으로의 라이브러리 변환으로 인해 코드가 Kotlin으로 작성된 경우 소스 비호환성 문제가 발생할 수 있습니다. 예를 들어, 비호환성 문제가 발생할 수 있다고 알려진 소스 변경 시 이제InvalidationTracker
의Observer
에onInvalidate()
를 선언하여MutableSet
이 아닌Set
유형의 매개변수를 사용해야 합니다. 게다가 특정 getter 메서드는 Kotlin 파일에서 속성 액세스 문법이 필요한 속성으로 변환되었습니다. 중대한 비호환성이 있는 경우 버그를 신고하세요. - 고유성 충돌이 없는 경우 항목을 삽입하려고 시도하거나 충돌이 있는 경우 항목을 업데이트하려고 시도하는 새로운 바로가기 주석
@Upsert
를 추가했습니다. (I7aaab, b/241964353) - Room Paging에서 지원을 위해 새로운 room-paging 아티팩트
room-paging-rxjava2
,room-paging-rxjava3
,room-paging-guava
를 추가했습니다. - 명확성을 위해
@MapInfo
에 키 및 값 테이블 이름을 제공하는 API를 추가했습니다. (Icc4b5)
버전 2.5.0-rc01
2022년 12월 7일
androidx.room:room-*:2.5.0-rc01
이 출시되었습니다. 버전 2.5.0-rc01에 포함된 커밋을 확인하세요.
- 이 버전은
2.5.0-beta02
버전과 동일합니다.
버전 2.5.0-beta02
2022년 11월 9일
androidx.room:room-*:2.5.0-beta02
가 출시되었습니다. 버전 2.5.0-beta02에 포함된 커밋을 확인하세요.
API 변경사항
- 자바의 배열 동작과 일치하도록 쿼리 인수를 불변(
Array<Any?>
)에서 반변(Array<out Any?>
)으로 사용하는 여러 API를 수정했습니다. (b/253531073)
버전 2.5.0-beta01
2022년 10월 5일
androidx.room:room-*:2.5.0-beta01
이 출시되었습니다. 버전 2.5.0-beta01에 포함된 커밋을 확인하세요.
API 변경사항
@Upsert
를 지원하는 최소 버전을 API 16으로 제한합니다. 이전 API에서는 기본 키의 제약 조건 충돌을 식별할 수 없기 때문입니다. (I5f67f, b/243039555)
버그 수정
- 섀도우 테이블을
.json
스키마 파일로 잘못 내보내서 테이블이 손상되는 문제를 해결했습니다. (I4f83b, b/246751839)
버전 2.5.0-alpha03
2022년 8월 24일
androidx.room:room-*:2.5.0-alpha03
이 출시되었습니다. 버전 2.5.0-alpha03에 포함된 커밋을 확인하세요.
새로운 기능
- 고유성 충돌이 없는 경우 항목을 삽입하려고 시도하거나 충돌이 있는 경우 항목을 업데이트하려고 시도하는 새로운 바로가기 주석
@Upsert
를 추가했습니다. (I7aaab, b/241964353)
버그 수정
- 이제 자동 이전 외래 키 제약 조건 검사 중에 Room에서
IllegalStateException
대신SQLiteConstraintException
이 발생합니다. (I328dd) getOpenHelper
,getQueryExecutor
,getTransactionExecutor
의 getter/속성에 Kotlin 소스가 호환되지 않는 변경사항이 수정되었습니다. (Iad0ac)
버전 2.5.0-alpha02
2022년 6월 1일
androidx.room:room-*:2.5.0-alpha02
가 출시되었습니다. 버전 2.5.0-alpha02에 포함된 커밋을 확인하세요.
새로운 기능
- Room Paging에서 지원하기 위해 새로운
room-paging
아티팩트room-paging-rxjava2
,room-paging-rxjava3
,room-paging-guava
가 추가되었습니다.(41a1d4,b/203666906),(eb6098,b/203666906),(1b9ae4b/20636)
API 변경사항
- 모든
room-runtime
이 자바에서 Kotlin으로 변환되었습니다. (If2069, b/206859668),(Ie4b55, b/206859668), (I697ee, b/206859668), I96c25, b참고: Kotlin으로 라이브러리를 변환하면 소스에서 비호환성 문제가 발생할 수 있습니다. 코드가 Kotlin에 있었고 이전 버전의 Room을 호출하는 경우 새 버전은 이러한 사례를 처리해야 합니다. 예를 들어, 비호환성 문제가 발생할 수 있다고 알려진 소스 변경 시 이제
InvalidationTracker
의Observer
에onInvalidate()
를 선언하여MutableSet
이 아닌Set
유형의 매개변수를 사용해야 합니다. - 명확성을 위해
@MapInfo
에 키 및 값 테이블 이름을 제공하는 API를 추가했습니다. (Icc4b5) - 속성 getter에서
@Ignore
를 다시 허용하도록 소스 호환성 문제를 수정했습니다. (Ifc2fb)
버그 수정
- 열 해상도 휴리스틱 알고리즘이 중복됩니다. 이제 Room에서 멀티매핑 쿼리의 모호한 열을 확인하려고 시도합니다. 이렇게 하면 동일한 이름 테이블을 포함하는 테이블이 있는 JOIN이 결과 데이터 객체에 올바르게 매핑될 수 있습니다. (I4b444, b/201306012, b/212279118)
버전 2.5.0-alpha01
2022년 2월 23일
androidx.room:room-*:2.5.0-alpha01
이 출시되었습니다. 버전 2.5.0-alpha01에 포함된 커밋을 확인하세요.
API 변경사항
- Room
@IntDef
사용이 Kotlin 소스에서 적용되지 않던 문제를 수정했습니다. (I75f41, b/217951311) - 속성 getter에서
@Query
를 다시 허용하도록 소스 호환성 문제를 수정했습니다. (I0a09b) - Room-common을 자바에서 Kotlin으로 변환했습니다. (I69c48, b/206858235)
참고: 라이브러리를 Kotlin으로 변환하는 동안 일부 속성이 컴패니언 객체로 이동되었으므로 소스 비호환 문제가 발생할 수 있습니다. 코드가 Kotlin에 있고 Room의 이전 버전을 호출하는 경우 이러한 속성에 액세스할 때는 새 버전에 '.Companion' 접미사가 필요합니다.
- room-migration을 자바에서 Kotlin으로 변환했습니다. (I2724b, b/206858622)
room-runtime
의paging
관련 파일을 자바에서 Kotlin으로 변환했습니다. (I82fc8, b/206859668)- 다중 프로세스의 첫 번째 데이터베이스 생성과 이전을 보호하기 위해 FrameworkSQLite* 수준에서 다중 프로세스 잠금과 사용을 위한 API를 추가했습니다. (Ied267, b/193182592)
버그 수정
- Kotlin 소스의 내부 속성 지원이 추가되었습니다.
이에 따라 Room에서 함수의 소스 이름을 getter/setter로 속성에 연결하는 동안 함수의 소스 이름을 사용하는 동작이 약간 변경되었습니다(이전에는 내부 함수/속성에 따라 다른 함수의 JVM 이름을 사용함).
맞춤
@JvmName
주석을 사용하여 getter/setter를 비공개 속성에 연결하는 경우 업데이트 후에 생성된 코드를 다시 확인하세요. (If6531, b/205289020)
버전 2.4.3
버전 2.4.3
2022년 7월 27일
androidx.room:room-*:2.4.3
이 출시되었습니다. 버전 2.4.3에 포함된 커밋을 확인하세요.
버그 수정
- Room이 Kotlin 1.7의 정지 함수를 인식하지 못하는 문제가 수정되었습니다. (b/236612358)
버전 2.4.2
버전 2.4.2
2022년 2월 23일
androidx.room:room-*:2.4.2
가 출시되었습니다. 버전 2.4.2에 포함된 커밋을 확인하세요.
버그 수정
-Xjvm-default=all
또는 이와 동등한 옵션을 사용한 컴파일로 인해 기본 인터페이스 메서드를 생성하는 본문이 포함된 Dao@Transaction
정지 함수용 코드를 생성할 때 발생하던 문제를 수정했습니다. (Ia4ce5)- Room에서
Array<ByteArray>
반환 유형 쿼리 메서드용 코드를 생성할 때 발생하는 버그를 해결했습니다. (If086e, b/213789489)
버전 2.4.1
버전 2.4.1
2022년 1월 12일
androidx.room:room-*:2.4.1
이 출시되었습니다. 버전 2.4.1에 포함된 커밋을 확인하세요.
버그 수정
- Kotlin 소스의 내부 속성 지원이 추가되었습니다.
이에 따라 Room에서 함수의 소스 이름을 getter/setter로 속성에 연결하는 동안 함수의 소스 이름을 사용하는 동작이 약간 변경되었습니다(이전에는 내부 함수/속성에 따라 다른 함수의 JVM 이름을 사용함).
맞춤
@JvmName
주석을 사용하여 getter/setter를 비공개 속성에 연결하는 경우 업데이트 후에 생성된 코드를 다시 확인하세요. (If6531, b/205289020)
버전 2.4.0
버전 2.4.0
2021년 12월 15일
androidx.room:room-*:2.4.0
이 출시되었습니다. 버전 2.4.0에 포함된 커밋을 확인하세요.
2.3.0 이후 중요 변경사항
- 자동 이전: 이제 스키마가 내보내지는 경우 Room이 이전을 자동으로 생성하는 API를 제공합니다. Room이 자동 이전을 생성해야 한다는 사실을 알 수 있도록 새 속성
@Database#autoMigrations
를 사용하여 자동 이전할 버전과 이전되는 버전을 선언할 수 있습니다. Room에 테이블 및 열 이름 바꾸기 또는 삭제에 관한 추가 정보가 필요하면@AutoMigration
주석은 이러한 입력이 포함된 사양 클래스를 선언할 수 있습니다. 자세한 내용은@AutoMigration
문서를 참고하세요. - 자동 이전에서 종속 항목 삽입:
@ProvidedAutoMigrationSpec
은AutoMigrationSpec
이RoomDatabase.Builder#addAutoMigrationSpec()
을 통해 런타임에 제공된다고 선언하는 새로운 API입니다. 이를 통해 종속 항목 삽입 프레임워크는 복잡한 종속 항목이 필요할 때 이러한 사양을 제공할 수 있습니다. - 자동 이전을 위한 이전 테스트 도우미 지원: 테스트 중인 데이터베이스 클래스를 수신하는 새로운 생성자 API를 제공하여 자동 이전을 지원하도록 Room의
MigrationTestHelper
를 업데이트했습니다. 이를 통해 도우미가 자동으로runMigrationsAndValidate
중에 동일한 방식으로 자동 이전을 추가할 수 있습니다. - Room-Paging 지원:
androidx.room:room-paging
이 출시되었습니다.androidx.paging.PagingSource
를 반환하는 Room 쿼리에 관한 네이티브 Paging 3.0을 지원합니다. - 관계형 쿼리 메서드: 이제 Room에서 JOIN 문에 유용한 멀티매핑 반환 유형
@Dao
메서드를 지원합니다. 지원되는 멀티매핑 유형은Map
,SparseArray
,LongSparseArray
와 Guava의ImmutableMap
,ImmutableSetMultimap
,ImmutableListMultimap
입니다.
버전 2.4.0-rc01
2021년 12월 1일
androidx.room:room-*:2.4.0-rc01
이 출시되었습니다. 버전 2.4.0-rc01에 포함된 커밋을 확인하세요.
새로운 기능
- Kotlin 1.6을 지원하기 위해 KSP에 대한 Room의 종속 항목을
1.6.0-1.0.1
으로 업데이트합니다.
버전 2.4.0-beta02
2021년 11월 17일
androidx.room:room-*:2.4.0-beta02
가 출시되었습니다. 버전 2.4.0-beta02에 포함된 커밋을 확인하세요.
새로운 기능
- @MapInfo에 SparseArray 및 LongSparseArray 지원을 추가했습니다. (Ic91a2b/138910317)
버그 수정
- 유형의 null 허용 여부 정보를 고려하는 새로운 TypeConverter 분석 도구를 추가했습니다. 이 정보는 KSP에서만 사용할 수 있으므로 기본적으로 KSP에서만 사용 설정됩니다. 문제가 발생하면 room.useNullAwareTypeAnalysis=false를 주석 프로세서에 전달하여 사용 중지할 수 있습니다. 이 플래그는 향후 삭제될 예정이므로 문제가 발생하는 경우 버그를 신고하시기 바랍니다. 이 새로운 TypeConverter 분석 도구를 사용하는 경우 null이 아닌 수신 TypeConverter만 제공하는 것이 좋습니다. 새로운 분석 도구에는 null 검사로 TypeConverter를 래핑하는 기능이 있기 때문입니다. 이는 KSP와 달리 KAPT 또는 자바를 주석 프로세서로 사용하는 사용자에게 영향을 미치지 않으며 유형에 null 허용 여부 정보를 포함하지 않습니다. (Ia88f9, b/193437407)
- FTS 항목이 ICU tokenizer를 사용하도록 선언했을 때 Room 컴파일이 SQL 오류와 함께 실패하는 버그를 수정했습니다. (I00db9, b/201753224)
- 버전 간 삽입된 항목에 새로운 열이 추가되는 자동 이전 관련 문제를 해결했습니다. (I5fcb1b/193798291)
- LEFT JOIN 쿼리의 관계형 쿼리 메서드 반환 유형과 관련된 문제를 해결했습니다. 이러한 변경으로 인해, 일대다 매핑이 존재할 때 키에 대해 반환된 컬렉션에는 잘못된 값 객체가 포함되지 않습니다(커서에서 발견되지 않는 경우). 유효한 값을 찾을 수 없으면 키는 빈 컬렉션에 매핑됩니다. (Id5552b/201946438)
- 열 이름에서 SQLite 키워드가 이스케이프되지 않는 자동 이전 문제를 해결했습니다. (Idbed4b/197133152)
버전 2.4.0-beta01
2021년 10월 13일
androidx.room:room-*:2.4.0-beta01
이 출시되었습니다. 버전 2.4.0-beta01에 포함된 커밋을 확인하세요.
버그 수정
- 동일한 자동 이전의 다른 표에도 이름이 같은 새 열이 있을 때 자동 이전이 새 열을 추가하지 않는 문제를 수정했습니다. (Ia5db5, b/200818663)
- 이제 room-paging에서 생성된 PagingSource 구현이
RoomDatabase.Builder
(이전의Dispatchers.IO
대신)를 통해 전달된queryExecutor
를 사용하므로 재정의할 수 있습니다. (Iae259)
버전 2.4.0-alpha05
2021년 9월 29일
androidx.room:room-*:2.4.0-alpha05
가 출시되었습니다. 버전 2.4.0-alpha05에 포함된 커밋을 확인하세요.
새로운 기능
- UUID용 내장 유형 변환기가 추가되었습니다. (I671e8, b/73132006)
API 변경사항
개발자가 내장 Enum 및 UUID 변환기를 사용 중지할 수 있도록 TypeConverters 주석에 새 속성이 추가되었습니다. 기본적으로 이러한 변환기는 사용 설정되지만, 특정 범위 또는 전체 데이터베이스에서 사용 중지할 수 있습니다. 자세한 내용은 TypeConverters 문서를 참고하세요. (36ae9e, b/195413406)
@MapInfo
주석을 통해 DAO의 멀티매핑 반환 유형에 POJO가 아닌 키/값을 지원합니다. (I4d704)
맵의 키 또는 값 열을 단일 열에서 가져온 경우 @MapInfo
가 필요합니다. 예:
@MapInfo(valueColumn = "songCount")
@Query("""
SELECT *, COUNT(mSongId) as songCount
FROM Artist JOIN Song ON Artist.artistName = Song.artist
GROUP BY artistName
""")
fun getArtistAndSongCounts(): Map<Artist, Integer>
- Room과 함께 Paging3을 사용할 때
room-paging
을 필수 아티팩트로 만듭니다. (Ieaffe)
버그 수정
- 맵 키의 열에 대한 ORDER BY 절이 쿼리에 포함된 경우 멀티매핑 쿼리 결과가 올바르게 정렬되지 않는 문제를 해결했습니다. (I6b887)
외부 기여
- @Index에 색인 순서를 지정하는 새 API를 추가했습니다. 니키타 젤론킨님 감사드립니다. (I033fc)
버전 2.4.0-alpha04
2021년 7월 21일
androidx.room:room-*:2.4.0-alpha04
가 출시되었습니다. 버전 2.4.0-alpha04에 포함된 커밋을 확인하세요.
새로운 기능
이제 Room에서 JOIN 문에 유용한 멀티매핑 반환 유형
@Dao
메서드를 지원합니다. 지원되는 멀티매핑 유형은Map
과 Guava의ImmutableMap
,ImmutableSetMultimap
,ImmutableListMultimap
입니다.다음은 멀티매핑 쿼리의 예시입니다.
일대일 관계 매핑
@Query("SELECT * FROM Song JOIN Artist ON Song.artistId = Artist.artistId") fun getSongAndArtist(): Map<Song, Artist>
일대다 관계 매핑(표준 멀티매핑)
@Query("SELECT * FROM Artist JOIN Album ON Artist.id = Album.artistId") fun getArtistAndAlbums(): Map<Artist, List<Album>>
멀티매핑 결과는
LiveData
나 Rx의Observable
, 코루틴Flow
등 지원되는 비동기 반환 유형으로 래핑될 수도 있습니다.
Room-Paging
androidx.room:room-paging
이 출시되었습니다.androidx.paging.PagingSource
를 반환하는 Room 쿼리에 관한 네이티브 Paging 3.0을 지원합니다.@Dao interface UserDao { @Query("SELECT * FROM users ORDER BY id ASC") fun loadUsers(): PagingSource<Int, User> }
이 아티팩트는 Room에서 생성한
androidx.paging.PagingSource
구현을 Paging 3.0 API에 기반하여 빌드된 구현으로 대체합니다. 새로운 PagingSource 구현은 키를 다르게 파싱하므로 Room의 PagingSource에 수동으로 제공된 모든 키는 Pager의 생성자를 통해 전달된 initialKey를 비롯하여 이러한 동작 변경사항을 고려해야 합니다. 페이지는Key
에서 로드되기 시작하고Key
는 첫 번째로 로드된 항목입니다. 이는LoadParams.Refresh.Key
가 사용자의 스크롤 위치로 처리되고 항목이 키 앞과 뒤에 모두 로드되는 기존 동작에서 벗어납니다.아티팩트는 선택사항이며 선택 해제하면 Room 2.3에서 도입된 기존 Paging 3.0 지원으로 대체됩니다. 그러나 이 아티팩트는 향후 버전에서 Paging 3.0이 적용된 Room을 사용하는 경우 선택사항이 아닙니다. 선택하려면 클래스 경로에 새로운 room-paging 아티팩트를 추가하세요. Gradle을 사용하는 경우 다음 스니펫을 build.gradle에 추가할 수 있습니다.
dependency { implementation("androidx.room:room-paging:2.4.0-alpha04") }
버그 수정
- 외래 키 위반 처리와 관련된 자동 이전 문제를 수정했습니다. (b/190113935)
버전 2.4.0-alpha03
2021년 6월 16일
androidx.room:room-*:2.4.0-alpha03
이 출시되었습니다. 버전 2.4.0-alpha03에 포함된 커밋을 확인하세요.
API 변경사항
- 테스트 중인 데이터베이스 클래스를 수신하는 새로운 생성자 API를 제공하여 자동 이전을 지원하도록 Room의
MigrationTestHelper
를 업데이트합니다. 이를 통해 도우미가 자동으로runMigrationsAndValidate
중에 동일한 방식으로 자동 이전을 추가할 수 있습니다.
버그 수정
Apple의 M1 칩을 지원하도록 Room의 SQLite 네이티브 라이브러리 관련 문제를 수정했습니다. (b/174695268)
@Transaction 함수의 반환 유형이 Flow인 경우 Room에서 오류가 발생하지 않는 문제를 수정했습니다. (I56ddd, b/190075899)
색인과 관련된 자동 이전 문제를 수정했습니다. (b/177673291)
종속 항목 업데이트
- 이제 Room의 KSP 지원이 KSP
1.5.10-1.0.0-beta01
에 종속됩니다. (1ecb11, b/160322705)
버전 2.4.0-alpha02
2021년 5월 5일
androidx.room:room-*:2.4.0-alpha02
가 출시되었습니다. 버전 2.4.0-alpha02에 포함된 커밋을 확인하세요.
API 변경사항
@ProvidedAutoMigrationSpec
은AutoMigrationSpec
이RoomDatabase.Builder#addAutoMigrationSpec()
을 통해 런타임에 제공된다고 선언하는 새로운 API입니다. 이를 통해 종속 항목 삽입 프레임워크는 복잡한 종속 항목이 필요할 때 이러한 사양을 제공할 수 있습니다.
버그 수정
@DatabaseView
가 올바르게 다시 생성되지 않는 자동 이전 문제를 수정합니다.
외부 기여
InvalidationTracker
콜백이 잘못 호출되거나 너무 늦게 호출되거나 전혀 호출되지 않은 Room의JournalMode.TRUNCATE
에서 발생하는 문제를 수정합니다.Uli Bubenheimer | bubenheimer@users.noreply.github.com
님 감사드립니다. (b/154040286)
버전 2.4.0-alpha01
2021년 4월 21일
androidx.room:room-*:2.4.0-alpha01
이 출시되었습니다. 버전 2.4.0-alpha01에 포함된 커밋을 확인하세요.
새로운 기능
- 자동 이전: 이제 스키마가 내보내지는 경우 Room이 이전을 자동으로 생성하는 API를 제공합니다. Room이 자동 이전을 생성해야 한다는 사실을 알 수 있도록 새 속성
@Database#autoMigrations
를 사용하여 자동 이전할 버전과 이전되는 버전을 선언할 수 있습니다. Room에 테이블 및 열 이름 바꾸기 또는 삭제에 관한 추가 정보가 필요하면@AutoMigration
주석은 이러한 입력이 포함된 사양 클래스를 선언할 수 있습니다. 자세한 내용은@AutoMigration
문서를 참고하세요.
버그 수정
- 추가 괄호가 있는
defaultValue
가 Room의 스키마 유효성 검사에서 잘못 확인되던 문제를 해결했습니다. (b/182284899)
버전 2.3.0
버전 2.3.0
2021년 4월 21일
androidx.room:room-*:2.3.0
이 출시되었습니다. 버전 2.3.0에 포함된 커밋을 확인하세요.
2.2.0 이후 중요 변경사항
- 내장 Enum 지원: 이제 Room에서 기본적으로 Enum에서 String으로의 변환을 사용하며, 값이 제공되지 않으면 반대 방향의 유형 변환기를 사용합니다. Enum의 유형 변환기가 이미 있는 경우에는 Room에서 기본값보다 우선 사용합니다.
- 쿼리 콜백: 이제 Room에서 쿼리가 곧 실행되려고 할 때 디버그 빌드를 로깅하는 데 유용한 일반 Callback API RoomDatabase.QueryCallback을 제공합니다. 콜백은
RoomDatabase.Builder#setQueryCallback()
을 통해 설정할 수 있습니다. - 개선사항 사전 패키징: Room에는 이제 입력 스트림에서 읽은 사전 패키징된 데이터베이스를 사용하여 데이터베이스를 만드는 API가 있습니다. 이는 사전 패키지 데이터베이스가 gzip으로 압축되는 등의 경우에 적용됩니다.
- 유형 변환기 제공: 이제 Room에는 앱에서 초기화를 제어할 수 있도록 유형 변환기의 인스턴스를 제공하는 API가 있습니다. Room에 제공될 유형 변환기를 표시하려면 새 주석인 @ProvidedTypeConverter를 사용하세요.
- RxJava3 지원: 이제 Room에서 RxJava3 유형을 지원합니다. RxJava2와 마찬가지로 반환 유형이 Flowable, Single, Maybe, Completable인 DAO 메서드를 선언할 수 있습니다. 또한 새로운 아티팩트
androidx.room:room-rxjava3
에서 RxJava3를 지원할 수 있습니다. - Paging 3.0 지원: Room에서 이제 반환 유형이
androidx.paging.PagingSource
인@Query
주석이 달린 메서드의 구현 생성을 지원합니다.
버전 2.3.0-rc01
2021년 3월 24일
androidx.room:room-*:2.3.0-rc01
이 출시되었습니다. 버전 2.3.0-rc01에 포함된 커밋을 확인하세요.
버그 수정
- Room에서 생성한 코루틴 흐름 쿼리가 정지 중인
withTransaction
블록에 사용되지 않도록 하는 문제가 수정되었습니다. (I797bf)
버전 2.3.0-beta03
2021년 3월 10일
androidx.room:room-*:2.3.0-beta03
이 출시되었습니다. 버전 2.3.0-beta03에 포함된 커밋을 확인하세요.
새로운 기능
- KSP용 증분 컴파일 지원을 추가했습니다. (I031c1, b/176453350)
버그 수정
- 기본 스레드에서 PagingSource를 생성할 때 ANR 트리거를 일으키는 버그를 수정했습니다. (I42b74, b/181221318)
@ExperimentalRoomApi
공개 상태가 패키지 비공개가 아닌 공개로 표시되도록 수정했습니다. (b/181356119)
외부 기여
- Room에서
@Query
주석이 지정된 DAO 메서드의 POJO 반환 유형을 허용합니다(DAO 메서드에@SkipQueryVerification
주석도 달린 경우). Room은 최대한@RawQuery
주석이 지정된 DAO 메서드에서 실행하는 방식과 동일한 방식으로 쿼리 결과를 POJO 반환 유형으로 변환합니다. '마쿠스 리겔 님(hey@marcorei.com)'께 감사드립니다. (I45acb)
버전 2.3.0-beta02
2021년 2월 18일
androidx.room:room-*:2.3.0-beta02
가 출시되었습니다. 버전 2.3.0-beta02에 포함된 커밋을 확인하세요.
새로운 기능
이제 Room에서 Kotlin Symbol Processing KSP를 실험적 차원에서 지원합니다.
KSP는 기본적으로 Kotlin 컴파일러에서 주석 프로세서를 실행하는 KAPT를 대체하며, 빌드 시간을 크게 줄여줍니다.
Room에 KSP를 사용하려면 KSP Gradle 플러그인을 적용하고 빌드 파일의
kapt
구성을ksp
로 바꾸면 됩니다. 예를 들어kapt 'androidx.room:room-compiler:2.3.0-beta02'
대신ksp 'androidx.room:room-compiler:2.3.0-beta02'
를 사용합니다. 자세한 내용은 KSP 문서를 참고하세요.KSP는 실험용이므로 프로덕션 코드에는 아직은 KAPT를 사용하는 것이 좋습니다. KAPT를 사용하는 다른 프로세서가 없는 경우에만 빌드 시간이 단축됩니다. 알려진 문제는 b/160322705를 참고하세요.
버전 2.3.0-beta01
2021년 1월 27일
androidx.room:room-*:2.3.0-beta01
이 출시되었습니다. 버전 2.3.0-beta01에 포함된 커밋을 확인하세요.
새로운 기능
- Auto Closable Databases: 이제 Room에서는 지정된 시간이 지나도 액세스되지 않는 데이터베이스를 닫을 수 있습니다. 실험용 기능이며
RoomDatabase.Builder#setAutoCloseTimeout()
을 호출하여 사용 설정할 수 있습니다. 이 기능은 데이터베이스가 여러 개인 애플리케이션에 유용합니다.
버그 수정
- 충돌 전략이 다양한 여러
@Update
또는@Delete
메서드가 있는 Dao 메서드가 전략 중 하나만으로 코드를 생성하여 정의된 전략을 사실상 무시하는 문제를 수정합니다. (/I0b90d, b/176138543)
버전 2.3.0-alpha04
2020년 12월 16일
androidx.room:room-*:2.3.0-alpha04
가 출시되었습니다. 버전 2.3.0-alpha04에 포함된 커밋을 확인하세요.
새로운 기능
- 이제 Room에서 쿼리를 실행하려고 할 때 호출되는 일반 Callback API
RoomDatabase.QueryCallback
을 제공하며, 이는 디버그 빌드를 로깅하는 데 유용합니다. 콜백은RoomDatabase.Builder#setQueryCallback()
을 통해 설정할 수 있습니다. (Iaa513, b/174478034, b/74877608) - 이제 Room에서 기본적으로 Enum - String 변환을 사용하며, 값이 제공되지 않으면 반대 방향의 유형 변환기를 사용합니다. Enum의 유형 변환기가 이미 있는 경우에는 Room에서 기본값보다 우선 사용합니다. (b/73132006)
알려진 문제
- Enum에 대한 읽기용 일방 유형 변환기가 이미 있는 경우 Room에서 의도치 않게 내장된 String - Enum 변환기를 사용하여 원치 않는 결과가 발생할 수 있습니다. 이는 알려진 문제이며 양방향 변환기로 전환하여 해결할 수 있습니다. b/175707691을 참고하세요.
버그 수정
- Room이 최신 JDK 버전에서 증분 주석 처리를 잘못 사용 중지하는 문제를 해결했습니다. (b/171387388)
- 여러 클래스 로더를 사용할 때 Room에서 생성된 클래스를 찾는 것과 관련된 문제를 해결했습니다. ‘Serendipity | 892449346@qq.com’님, 수정해 주셔서 감사합니다. (b/170141113)
- Kotlin
@Dao
에 제네릭이 JVM의 프리미티브인 기본 클래스가 있으면 Room에서 잘못된 코드를 생성하는 문제를 해결했습니다. (b/160258066)
외부 기여
- 이제 WAL 모드가 사용 설정되고 API가 16 이상이면 Room에서 기본적으로
beginTransactionNonExclusive
를 사용합니다. ‘Ahmed I. Khalil | ahmedibrahimkhali@gmail.com’님, 감사합니다. (b/126258791)
버전 2.3.0-alpha03
2020년 10월 14일
androidx.room:room-*:2.3.0-alpha03
가 출시되었습니다. 버전 2.3.0-alpha03에 포함된 커밋을 확인하세요.
새로운 기능
Room에는 이제 앱에서 초기화를 제어할 수 있도록 유형 변환기의 인스턴스를 제공하는 API가 있습니다. Room에 제공될 유형 변환기를 표시하려면 새 주석인
@ProvidedTypeConverter
를 사용하세요. 'mzgreen yairobbe@gmail.com'님께 감사드립니다. (Ie4fa5, b/121067210)Room에는 이제 입력 스트림에서 사전 패키징된 데이터베이스 읽기를 사용하여 데이터베이스를 만들기 위한 API가 있습니다. 이는 사전 패키지 데이터베이스가 gzip으로 압축되는 등의 경우에 적용됩니다. '아메드 엘 헬브 ahmedre@gmail.com'님께 감사드립니다. (3e6792, b/146911060)
API 변경사항
@Entity
주석 외부에서@ForeignKey
주석의 사용을 방지하는 누락된 타겟을 추가했습니다. (Iced1e)RoomDatabase.java
의mCallbacks
필드가 이제 숨겨집니다. (d576cb, b/76109329)
버그 수정
TypeConverter는 행이 아닌 열/필드를 변환하는 데만 사용될 수 있다는 점을 명확히 하기 위해 TypeConverter 문서를 업데이트합니다. (I07c56, b/77307836)
Kotlin '프리미티브'가 포함된 일반 슈퍼 유형을 사용하는 Dao의 컴파일러 오류 수정을 위해 DaoProcessor를 업데이트합니다. (Ice6bb, b/160258066)
스레딩을 명확히 하기 위해 관찰자 추가/삭제 메서드 문서를 업데이트합니다. (Ifd1d9, b/153948821)
Room에서 rowid 열을 선언한 FTS 테이블의 유효성 검사 오류 문제를 수정합니다. (d62ebc, b/145858914)
외부 기여
터키어 관련 대문자/소문자 언어 문제를 수정합니다. (5746e3), b/68159494
Android Lollipop에 문제가 발생하지 않도록
RoomDatabase
내부의ConcurrentHashMap
을Collections.synchronizedMap()
으로 대체합니다. (d1cfc7, b/162431855)사전 패키징된 DB가 복사되는 경우를 위해 onOpenPrepackagedDatabase 콜백을 추가합니다. (I1ba74, b/148934423)
버전 2.3.0-alpha02
2020년 7월 22일
androidx.room:room-*:2.3.0-alpha02
가 출시되었습니다. 버전 2.3.0-alpha02에 포함된 커밋을 확인하세요.
새로운 기능
- RxJava3 지원: 이제 Room에서 RxJava3 유형을 지원합니다. RxJava2와 마찬가지로 반환 유형이 Flowable, Single, Maybe, Completable인 DAO 메서드를 선언할 수 있습니다. 또한 새로운 아티팩트
androidx.room:room-rxjava3
에서 RxJava3를 지원할 수 있습니다. (b/152427884)
API 변경사항
- 이제 Kotlin 객체 클래스에서
@TypeConverter
선언이 지원됩니다. (b/151110764) - Room의 증분 주석 프로세서 옵션이 이제 기본으로 사용 설정됩니다. (b/112110217)
버전 2.3.0-alpha01
2020년 6월 10일
androidx.room:room-*:2.3.0-alpha01
가 출시되었습니다. 버전 2.3.0-alpha01에 포함된 커밋을 확인하세요.
새로운 기능
Paging 3.0 지원: Room에서 이제 반환 유형이
androidx.paging.PagingSource
인@Query
주석이 달린 메서드의 구현 생성을 지원합니다.@Dao interface UserDao { @Query("SELECT * FROM users ORDER BY id ASC") fun pagingSource(): PagingSource<Int, User> }
API 변경사항
@RewriteQueriesToDropUnusedColumns
는 Room에서 쿼리의 '*' 프로젝션을 재작성하도록 하여 결과에서 사용되지 않는 열을 삭제하는 편리한 새 주석입니다.- 이제 프로세서 옵션
room.expandProjection
이 지원 중단됩니다. 별표 프로젝션으로 쿼리를 최적화하는 Room의 대안으로@RewriteQueriesToDropUnusedColumns
를 사용하세요.@RewriteQueriesToDropUnusedColumns
은@Embedded
필드가 포함된 반환 유형과 관련하여 제공되는 열 충돌 솔루션인room.expandProjection
을 대체하지 않습니다.
버그 수정
- 증분 주석 프로세서를 사용 설정하는 데 사용되는 JDK 버전을 Room에서 올바르게 감지하지 못하는 버그가 수정되었습니다. Blaz Solar(me@blaz.solar)에게 감사드립니다. (b/155215201)
- Room은 이제 ANTLR을 사용하는 다른 프로세서와 버전 충돌을 방지하기 위해 주석 프로세서에 ANTLR 종속 항목을 삽입합니다. (b/150106190)
버전 2.2.6
버전 2.2.6
2020년 12월 16일
androidx.room:room-*:2.2.6
이 출시되었습니다. 버전 2.2.6에 포함된 커밋을 확인하세요.
버그 수정
- Room이 최신 JDK 버전에서 증분 주석 처리를 잘못 사용 중지하는 문제를 해결했습니다. (b/171387388)
버전 2.2.5
버전 2.2.5
2020년 3월 18일
androidx.room:room-*:2.2.5
가 출시되었습니다. 버전 2.2.5에 포함된 커밋을 확인하세요.
버그 수정
MultiInstanceInvalidationService
를 directBootAware로 만듭니다. 'Mygod contact-git@mygod.be'님 감사합니다. (b/148240967).- 다중 인스턴스 무효화가 사용 설정되고 데이터베이스에 FTS 항목이 포함되면 충돌이 발생하는 버그가 수정되었습니다. (b/148969394 참고)
- Room 주석 프로세서에서 SQLite 네이티브 라이브러리를 로드할 때 병렬 컴파일로 인해 컴파일러에서 충돌이 발생하는 문제가 수정되었습니다. (b/146217083 참조)
버전 2.2.4
버전 2.2.4
2020년 2월 19일
androidx.room:room-common:2.2.4
, androidx.room:room-compiler:2.2.4
, androidx.room:room-guava:2.2.4
, androidx.room:room-ktx:2.2.4
, androidx.room:room-migration:2.2.4
, androidx.room:room-runtime:2.2.4
, androidx.room:room-rxjava2:2.2.4
, androidx.room:room-testing:2.2.4
가 출시되었습니다. 버전 2.2.4에 포함된 커밋을 확인하세요.
버그 수정
- 트랜잭션이 실제로 시작되기 전에 코루틴이 빠르게 취소될 경우 교착 상태가 발생하는 트랜잭션 정지 관련 문제가 해결되었습니다. (b/148181325 참고)
- JDK 9 빌드 시 잘못 사용되던 @Generated 관련 문제가 수정되었습니다. (b/146538330 참고)
- Kotlin의 DAO 인터페이스에 구체적인 함수가 있는 경우 Room에서 잘못된 코드를 생성하는 문제가 해결되었습니다. (b/146825845 참조)
버전 2.2.3
버전 2.2.3
2019년 12월 18일
androidx.room:room-*:2.2.3
가 출시되었습니다. 버전 2.2.3에 포함된 커밋을 확인하세요.
버그 수정
- 이전을 거치지 않았으며 스키마에 색인이 있는 레거시 해시가 포함된 데이터베이스의 경우 Room에서 유효성 검사를 하지 못하는 버그가 수정되었습니다. (b/139306173 참조)
버전 2.2.2
버전 2.2.2
2019년 11월 20일
androidx.room:room-*:2.2.2
가 출시되었습니다. 버전 2.2.2에 포함된 커밋을 확인하세요.
버그 수정
- 999개가 넘는 행과의 일대일 관계를 수집하면 Room에서 null인 관련 항목을 반환하는 버그가 수정되었습니다. (b/143105450)
버전 2.2.1
버전 2.2.1
2019년 10월 23일
androidx.room:room-*:2.2.1
이 출시되었습니다. 버전 2.2.1에 포함된 커밋을 확인하세요.
버그 수정
- 컴파일러 옵션
expandProjection
이 사용 설정되어 있을 때 Room에서CURSOR_MISMATCH
관련 경고를 잘못 표시하는 버그가 수정되었습니다. (b/140759491) - 컴파일 시간에 쿼리를 확인하는 데 사용되는 누락된 네이티브 라이브러리를 처리하기 위한 재시도 메커니즘이 추가되었습니다.
버전 2.2.0
버전 2.2.0
2019년 10월 9일
androidx.room:room-*:2.2.0
가 출시되었습니다. 버전 2.2.0에 포함된 커밋을 확인하세요.
버전 2.1.0 이후 중요 변경사항
- 사전 패키지 데이터베이스:
RoomDatabase.Builder
의 두 가지 새 API는 이미 채워진 데이터베이스 파일을 고려하여RoomDatabase
생성에 사용할 수 있습니다.createFromAsset()
은 미리 채워진 데이터베이스 파일이 APK의 애셋 폴더에 있는 경우에 사용하고,createFromFile()
은 파일이 임의의 위치에 있는 경우에 사용합니다. 이러한 API를 사용하면 대체 이전을 진행하는 동안 가능하면 Room에서 자동 입력된 데이터베이스를 다시 복사하려고 시도하고 그렇지 않으면 모든 테이블을 삭제하고 다시 생성하는 방식으로 파괴적인 이전 동작이 변경됩니다. (b/62185732) - 스키마 기본값: 이제
@ColumnInfo
에는 열의 기본값을 지정하는 데 사용할 수 있는 새defaultValue
속성이 있습니다. 기본값은 데이터베이스 스키마의 일부이며 지정된 경우 이전 중에 유효성을 검사합니다. (b/64088772 참고) - 다대다 관계: 이제
@Relation
에는 새 주석@Junction
을 사용하는 새 속성associateBy
가 있으며 이 속성은 연결 테이블(조인 테이블이라고도 함)을 통해 충족되어야 하는 관계를 선언합니다. (b/69201917) - 일대일 관계:
@Relation
으로 주석 처리된 POJO 필드가List
또는Set
유형이어야 하는 제한사항이 사라져 단일 값 관계를 효과적으로 나타낼 수 있습니다. (b/62905145 참고) - 타겟 항목: 이제 DAO 주석인
@Insert
,@Update
및@Delete
에 새targetEntity
속성이 있으며 이 속성을 사용하여 DAO 메서드가 작동할 타겟 테이블을 지정할 수 있습니다. 이 속성은 부분 항목으로 해석되는 임의의 POJO를 이러한 DAO 메서드의 매개변수로 허용합니다. 실제로 부분 삽입, 삭제, 업데이트가 가능합니다. (b/127549506 참고) - Coroutines Flow:
@Query
DAO 메서드는 이제Flow<T>
반환 유형을 사용할 수 있습니다. 쿼리 중인 관찰 테이블이 무효가 되면 반환된 Flow는 새로운 값 집합을 다시 내보냅니다.Channel<T>
반환 유형으로 DAO 함수를 선언하면 오류가 발생합니다. 대신 Room에서는Flow
를 사용한 후 인접 함수를 사용하여Flow
를Channel
로 변환하는 것이 좋습니다. (b/130428884 참고) - Gradle 증분 주석 프로세서: Room은 이제 Gradle 분리 주석 프로세서이며 프로세서 옵션인
room.incremental
을 통해 증분성을 사용 설정할 수 있습니다. 자세한 내용은 Room 컴파일러 옵션을 참조하세요. 문제가 발생하면 여기에 버그를 신고하세요. 향후 안정화된 버전에서는 기본적으로 증분성을 사용 설정할 예정입니다. (b/112110217) - 확장 프로젝션: Room에서 반환 유형이 POJO인 열만 포함하기 위해 별표 프로젝션을 사용하여 쿼리를 다시 쓰도록 하는 새로운 실험용 컴파일러 옵션인
room.expandProjection
이 추가되었습니다.@Query("SELECT * FROM Song")
을 사용하여 두 개의 필드만 있는SongIdAndTitle
이라는 POJO를 반환하는 DAO 메서드를 예로 들 수 있습니다. Room에서는 반환 유형을 충족하는 최소 열 집합을 가져오도록 쿼리를SELECT id, title FROM Song
으로 다시 씁니다. 그러면 이는 기본적으로 쿼리에서 POJO 반환 유형에 일치하는 필드가 없는 추가 열을 반환할 때CURSOR_MISMATCH
경고가 나타나지 않게 합니다.
버전 2.2.0-rc01
2019년 9월 5일
androidx.room:room:2.2.0-rc01
이 출시되었습니다. 이 버전에 포함된 커밋은 여기에서 확인할 수 있습니다.
Room 2.2.0-beta01
이후 공개 변경사항이 없습니다.
버전 2.2.0-beta01
2019년 8월 22일
androidx.room:room-*:2.2.0-beta01
가 출시되었습니다. 이 버전에 포함된 커밋은 여기에서 확인할 수 있습니다.
버그 수정
- 특정 시간이 지나면 Coroutine Flow 쿼리가 새 값 출력을 중지하는 버그를 수정했습니다. (b/139175786)
- Room 1.0 이후 이전하지 않은 데이터베이스를 열 때 Room에서 레거시 스키마 해시 코드를 허용하지 않아서 잘못된 스키마로 인해 런타임 충돌이 발생하는 버그를 수정했습니다. (b/139306173)
버전 2.2.0-alpha02
2019년 8월 7일
androidx.room:room-*:2.2.0-alpha02
이 출시되었습니다. 이 버전에 포함된 커밋은 여기에서 확인할 수 있습니다.
새로운 기능
- Coroutines Flow:
@Query
DAO 메서드는 이제Flow<T>
반환 유형을 사용할 수 있습니다. 쿼리 중인 관찰 테이블이 무효가 되면 반환된 Flow는 새로운 값 집합을 다시 내보냅니다.Channel<T>
반환 유형으로 DAO 함수를 선언하면 오류가 발생합니다. 대신 Room에서는Flow
를 사용한 후 인접 함수를 사용하여Flow
를Channel
로 변환하는 것이 좋습니다. (b/130428884 참고) - 확장 프로젝션: Room에서 반환 유형이 POJO인 열만 포함하기 위해 별표 프로젝션을 사용하여 쿼리를 다시 쓰도록 하는 새로운 실험용 컴파일러 옵션인
room.expandProjection
이 추가되었습니다.@Query("SELECT * FROM Song")
을 사용하여 두 개의 필드만 있는SongIdAndTitle
이라는 POJO를 반환하는 DAO 메서드를 예로 들 수 있습니다. Room에서는 반환 유형을 충족하는 최소 열 집합을 가져오도록 쿼리를SELECT id, title FROM Song
으로 다시 씁니다. 그러면 이는 기본적으로 쿼리에서 POJO 반환 유형에 일치하는 필드가 없는 추가 열을 반환할 때CURSOR_MISMATCH
경고가 나타나지 않게 합니다. onDestructiveMigrate
는 Room에서 데이터베이스를 이전할 때 파괴되는 경우를 대비해RoomDatabase.Callback
에 추가한 새로운 콜백 API입니다. (b/79962330)
버그 수정
- 메서드를 보호되는 필드의 필드 setter로 사용하면 Room에서 잘못된 코드를 생성하는 버그를 수정했습니다. (b/136194628)
- 다중 인스턴스 무효화가 사용 설정되고 무효화 서비스가 종료되었을 때 InvalidationTracker가 두 번째 프로세스에서 NPE를 발생시키는 버그를 수정했습니다. (b/137454915)
- Room에서
@RawQuery
주석이 달린 상속된 정지 함수의 반환 유형을 제대로 식별하지 못하는 버그를 수정했습니다. (b/137878827) - 관련 키가 BLOB 유형인 경우 비교 가능한
ByteBuffer
를 사용하도록@Relation
용으로 생성되는 코드를 업데이트했습니다. (b/137881998 참고) - Room에서
@Insert
,@Update
및@Delete
의 부분 항목 매개변수로 사용되는 POJO에 setter가 누락되었음을 표시하는 버그를 수정했습니다. (b/138664463 참고) - 특정 DAO 메서드에서 항목 클래스가 사용될 때 Room에서
@Entity
를 통해 무시된 열의 getter 및 setter가 누락되었음을 표시하는 버그를 수정했습니다. (b/138238182) - 재사용된 매개변수로 쿼리를 실행할 때 Room에서 이름이 지정된 결합 인수를 위치 인수로 올바르게 변환하지 못하여 런타임 예외가 발생하는 버그를 수정했습니다. (b/137254857)
버전 2.2.0-alpha01
2019년 7월 10일
새로운 기능
- 사전 패키지 데이터베이스:
RoomDatabase.Builder
의 두 가지 새 API는 이미 채워진 데이터베이스 파일을 고려하여RoomDatabase
생성에 사용할 수 있습니다.createFromAsset()
은 미리 채워진 데이터베이스 파일이 APK의 애셋 폴더에 있는 경우에 사용하고,createFromFile()
은 파일이 임의의 위치에 있는 경우에 사용합니다. 이러한 API를 사용하면 대체 이전을 진행하는 동안 가능하면 Room에서 자동 입력된 데이터베이스를 다시 복사하려고 시도하고 그렇지 않으면 모든 테이블을 삭제하고 다시 생성하는 방식으로 파괴적인 이전 동작이 변경됩니다. (b/62185732) - 스키마 기본값: 이제
@ColumnInfo
에는 열의 기본값을 지정하는 데 사용할 수 있는 새defaultValue
속성이 있습니다. 기본값은 데이터베이스 스키마의 일부이며 지정된 경우 이전 중에 유효성을 검사합니다. (b/64088772)참고: 데이터베이스 스키마에 이미 기본값(예:
ALTER TABLE x ADD COLUMN y INTEGER NOTNULL DEFAULT z
를 통해 추가된 값)이 있고 기본값을@ColumnInfo
를 통해 동일한 열로 정의하려면 이전을 제공하여 산정되지 않은 기본값의 유효성을 검증해야 할 수 있습니다. 자세한 내용은 Room 이전을 참고하세요. - 다대다 관계: 이제
@Relation
에는 새 주석@Junction
을 사용하는 새 속성associateBy
가 있으며 이 속성은 연결 테이블(조인 테이블이라고도 함)을 통해 충족되어야 하는 관계를 선언합니다. (b/69201917) - 일대일 관계:
@Relation
으로 주석 처리된 POJO 필드가List
또는Set
유형이어야 하는 제한사항이 사라져 단일 값 관계를 효과적으로 나타낼 수 있습니다. (b/62905145 참고) - 타겟 항목: 이제 DAO 주석인
@Insert
,@Update
및@Delete
에 새targetEntity
속성이 있으며 이 속성을 사용하여 DAO 메서드가 작동할 타겟 테이블을 지정할 수 있습니다. 이 속성은 부분 항목으로 해석되는 임의의 POJO를 이러한 DAO 메서드의 매개변수로 허용합니다. 실제로 부분 삽입, 삭제, 업데이트가 가능합니다. (b/127549506 참고) - Gradle 증분 주석 프로세서: Room은 이제 Gradle 분리 주석 프로세서이며 프로세서 옵션인
room.incremental
을 통해 증분성을 사용 설정할 수 있습니다. 자세한 내용은 Room 컴파일러 옵션을 참조하세요. 문제가 발생하면 여기에 버그를 신고하세요. 향후 안정화된 버전에서는 기본적으로 증분성을 사용 설정할 예정입니다. (b/112110217)
버그 수정
- 쿼리가 완료되기 전에 쿼리의 Rx 스트림이 삭제되면 Room에서 더 이상
EmptySetResultException
을 전역 오류 핸들러로 전파하지 않습니다. (b/130257475) @RawQuery
로 주석 처리된 정지 DAO 함수에 반환 유형이 없을 때 Room에서 잘못된 오류 메시지를 표시하는 버그를 수정했습니다. (b/134303897)- Room에서 더 이상 원시 유형을 사용하는 DAO 어댑터를 생성하지 않습니다. (b/135747255)
버전 2.1.0
버전 2.1.0
2019년 6월 13일
Room 2.1.0이 2.1.0-rc01
에서 변경사항 없이 출시되었습니다. 이 버전에 포함된 커밋은 여기에서 확인할 수 있습니다.
2.0.0 이후 중요 변경사항
- FTS: 이제 Room에서 매핑 FTS3 또는 FTS4 테이블이 있는 항목을 지원합니다. 이제
@Entity
로 주석 처리된 클래스에서@Fts3
또는@Fts4
주석을 추가하여 매핑 전체 텍스트 검색 테이블이 있는 클래스를 선언할 수 있습니다. 추가 맞춤설정을 위한 FTS 옵션은 주석의 메서드를 통해 사용할 수 있습니다. - View: 이제 Room에서
@DatabaseView
주석을 사용하여 저장된 쿼리로 클래스(view라고도 함)를 선언할 수 있습니다. - 코루틴: DAO 메서드는 현재 정지된 기능일 수 있습니다. 이 기능을 활용하려면 종속 항목에
room-ktx
를 포함하세요. 또한 ktx 아티팩트는 코루틴 내에서 데이터베이스 트랜잭션을 실행하기 위한 확장 함수인RoomDatabase.withTransaction
을 제공합니다. - Auto Value: 이제 Room에서 AutoValue 주석이 달린 클래스를 항목과 POJO로 선언할 수 있습니다. 이제 auto value로 주석 처리된 클래스의 추상 메서드에서 Room 주석인
@PrimaryKey
,@ColumnInfo
,@Embedded
및@Relation
을 선언할 수 있습니다. 이러한 주석을@CopyAnnotations
와 함께 제공해야 Room에서 제대로 이해할 수 있습니다. - 추가 비동기 지원: 이제
@Insert
,@Delete
또는@Update
로 주석 처리된 DAO 메서드에서INSERT
,DELETE
또는UPDATE
문을 포함하는@Query
와 함께 Rx 반환 유형Completable
,Single
,Maybe
와 Guava의 반환 유형ListenableFuture
를 지원하며 이러한 메서드는 정지 함수일 수도 있습니다. enableMultiInstanceInvalidation
:RoomDatabase.Builder
의 새 API로, 동일한 데이터베이스 파일을 사용하는 여러 RoomDatabase 인스턴스에서 무효화를 사용 설정합니다.fallbackToDestructiveMigrationOnDowngrade
:RoomDatabase.Builder
의 새 API로, 다운그레이드가 발생하면 자동으로 데이터베이스를 다시 생성합니다.ignoredColumns
: 무시된 필드를 이름별로 나열하는 데 사용할 수 있는@Entity
주석의 새 API입니다.- 이제 Room에서 속성을
vars
로 선언할 필요가 없도록 데이터 클래스의 Kotlin 기본 생성자를 적절히 사용합니다.
버전 2.1.0-rc01
2019년 5월 29일
버그 수정
- 이미 설정한 temp_store 구성으로 인해 발생할 수 있는 Room 초기화 오류를 해결했습니다. (b/132602198 참고)
- SQLite 3.27.0 이상을 사용하는 사용자의 큰따옴표 사용 경고를 수정했습니다. (b/131712640)
- 여러 무효화 검사가 동시에 발생할 때 InvalidationTracker가 다운되는 버그를 수정했습니다. (b/133457594 참고)
버전 2.1.0-beta01
2019년 5월 7일
androidx.room 2.1.0-beta01
이 2.1.0-alpha07에서 변경사항 없이 출시되었습니다. 이 버전에 포함된 커밋은 여기에서 확인할 수 있습니다.
버전 2.1.0-alpha07
2019년 4월 25일
API/동작 변경사항
CoroutineScope
이 포함된 함수 블록을 더 이상 수신자로 사용하지 않도록RoomDatabase.withTransaction
확장 함수가 변경되었습니다. 이제 트랜잭션 블록에서 작업을 동시에 실행하는 데 필요한 추가coroutineScope { }
래퍼를 건너뛸 수 없습니다.
버그 수정
- Room에서 Collection 유형의 매개변수를 포함하는 Kotlin DAO 함수의 TypeConverter를 일치시키지 못하는 버그를 수정했습니다. (b/122066791 참고)
버전 2.1.0-alpha06
2019년 3월 22일
API/동작 변경사항
- 이제 Room에서 데이터베이스 트랜잭션을 실행하기 위해 둘 이상의 스레드를 사용하지 않도록 비동기 트랜잭션 쿼리를 직렬화했습니다.
트랜잭션에 사용할 실행기를 구성할 수 있도록
RoomDatabase.Builder.setTransactionExecutor(Executor)
를 추가했습니다. RoomDatabase.runInTransaction(Callable)
은 더 이상 확인된 예외를 RuntimeExceptions로 래핑하지 않습니다. (b/128623748)
버그 수정
- 콘텐츠 테이블과 외부 콘텐츠 FTS 테이블 양쪽에 관찰자가 추가되면 무효화 추적기에서 콘텐츠 테이블 관찰을 중지하는 버그를 수정했습니다. (b/128508917)
- Room의 SQLite 문법이 SQLite 3.24.0과 일치하도록 업데이트했습니다. (b/110883668 참고)
버전 2.1.0-alpha05
2019년 3월 13일
새로운 기능
- 확장 함수
RoomDatabase.withTransaction
을 사용하면 코루틴 내에서 데이터베이스 트랜잭션을 안전하게 실행할 수 있습니다. Room 확장 함수를 코루틴 지원과 함께room-ktx
아티팩트에서 사용할 수 있습니다. @Transaction
으로 주석 처리된 비추상 DAO 메서드가 이제 정지 함수가 될 수 있습니다. (b/120241587 참고)
API/동작 변경사항
- 다른 androidx 아티팩트와 동일한 이름 지정 방식에 따라 아티팩트
room-coroutines
의 이름을room-ktx
로 변경했습니다. RoomDatabase
의beginTransaction
,setTransactionSuccessful
,endTransaction
이 지원 중단되고runInTransaction
및room-ktx
확장 함수withTransaction
으로 대체되었습니다.
버그 수정
- 사용된 tokenizer가 단순할 때 tokenizer 인수가 삭제되는 버그를 수정했습니다. b/125427014
- Room에서 형식이 내부 클래스인 매개변수를 포함하는 정지 함수를 올바르게 식별하지 못하는 버그를 수정했습니다. (b/123767877)
INSERT
,UPDATE
,DELETE
문이 포함된 지연된@Query
DAO 메서드가 기본 스레드에서 쿼리를 준비하는 버그를 수정했습니다. (b/123695593)- Room에서 특정 정지 함수에 관해 잘못된 코드를 생성하는 다양한 버그를 수정했습니다. (b/123466702 및 b/123457323 참조)
- 생성된 코드에서 지원 중단된 메서드 사용이 올바르게 억제되지 않는 버그를 수정했습니다. b/117602586
- androidx.sqlite의 Room 종속 항목을 1.0.2로 업데이트했으며, 이 버전에는 손상된 데이터베이스를 올바르게 처리하기 위한 수정사항이 포함되어 있습니다. (b/124476912)
알려진 문제
- Room 2.1.0-alpha05는 Maven Central(KT-27991)에서 현재 제공되지 않는
kotlinx-metadata-jvm
아티팩트에 종속됩니다. 프로젝트 저장소에maven { url "https://kotlin.bintray.com/kotlinx/" }
를 추가하여 이 종속 항목을 해결할 수 있습니다.
버전 2.1.0-alpha04
2019년 1월 25일
새로운 기능
INSERT
,UPDATE
,DELETE
문이 포함된@Query
로 주석 처리된 DAO 메서드는 이제 비동기 유형Single
,Mayble
,Completable
,ListenableFuture
를 반환할 수 있습니다. 또한 정지 함수일 수도 있습니다. (b/120227284 참조)
API/동작 변경사항
- Room에서는 이제
@Transaction
으로 주석 처리된 비추상 DAO 메서드가Single
,Mayble
,Completable
,LiveData
,ListenableFuture
와 같은 비동기 유형을 반환하는 경우 오류가 발생합니다. 트랜잭션은 스레드 제한이 있으므로, 현재 Room에서 함수와 관련해 다른 스레드에 있는 쿼리를 실행할 수 있는 트랜잭션을 시작 및 종료할 수 없습니다. (b/120109336) OnConflictStrategy.FAIL
및OnConflictStrategy.ROLLBACK
은 Android의 현재 SQLite 바인딩에서 의도한 대로 동작하지 않으므로@Deprecated
주석이 지정되었습니다. (b/117266738)
버그 수정
- DAO 메서드가 정지된 함수일 경우 Room에서 반환 유형의 TypeConverter가 올바르게 사용되지 않는 버그를 수정했습니다. b/122988159
- Room에서 상속된 정지된 함수를 정지되지 않은 것으로 잘못 식별하는 버그를 수정했습니다. b/122902595
@Embedded
필드가 상위 클래스에 있고 여러 하위 클래스에서 사용될 때 Room에서 잘못된 코드를 생성하는 버그를 수정했습니다. (b/121099048)beginTransaction()
과endTransaction()
사이의 DAO 정지 함수를 호출할 때 데이터베이스가 교착 상태에 빠지는 문제를 해결했습니다. (b/120854786)
버전 2.1.0-alpha03
2018년 12월 4일
API 변경사항
@Fts3
/@Fts4
의 FTStokenizer
가 이제 Enum 대신 문자열을 취합니다. 이렇게 하면 Room에서 맞춤 tokenizer를 사용할 수 있습니다. 내장된 tokenizer는 여전히FtsOptions
에서 문자열 상수로 정의됩니다. (b/119234881 참조)
새로운 기능
- 코루틴: DAO 메서드는 현재 정지된 기능일 수 있습니다. Room에서 정지 함수를 지원하기 위해 새로운 아티팩트인
room-coroutines
가 출시되었습니다. b/69474692 @Insert
,@Delete
또는@Update
로 주석 처리된 DAO 메서드는 이제ListenableFuture
를 반환 유형으로 지원합니다. (b/119418331)
버그 수정
- Room에서
@Entity
의ignoredColumns
속성에 있는 열이 포함된 생성자를 제대로 찾지 못하는 버그를 수정했습니다. b/119830714 - Room이 DAO 메서드 매개변수의 생성된 구현에서 DAO 메서드 매개변수를 최종으로 표시하지 않는 버그가 수정되었습니다. b/118015483
- 특수 기호가 있는 쿼리에서 오류를 보고할 때 Room의 프로세서가 다운되는 버그가 수정되었습니다. b/119520136
- Room에서 기타 다양한
Collection
구현을IN
표현식의 인수로 거부하는 버그를 수정했습니다. b/119884035 - 지속적으로 관찰할 경우 Room에서 반환된 LiveData가 가비지를 수집하여 더 이상 새 데이터를 생산하지 않게 하는 버그가 수정되었습니다. b/74477406
- 잠금 경합을 줄이기 위해
RoomDatabase
의 닫기 잠금을 업데이트했습니다. (b/117900450 참고)
버전 2.1.0-alpha02
2018년 10월 30일
새로운 기능
@Relation
에서@DatabaseView
참조 지원을 추가했습니다. (b/117680932)
버그 수정
- Rx 반환 유형에서 구독 및 배치할 때 Room이 기본 스레드에서 디스크 I/O를 수행하는 버그가 수정되었습니다. b/117201279
- Room이 Kotlin 엔티티 클래스에서 필드에 적절한 유형 변환기를 찾지 못하는 버그가 수정되었습니다. b/111404868
- Room에서 인수가 없는 Kotlin 기본 메서드가 포함된
DAO
인터페이스 구현에 잘못된 코드를 생성하는 버그가 수정되었습니다. (b/117527454) - Room의 SQLite 문법 파서가 업데이트되었으며 빌드 시간이 오래 걸리는 성능 문제가 수정되었습니다. (b/117401230)
버전 2.1.0-alpha01
2018년 10월 8일
새로운 기능
- FTS: 이제 Room에서 매핑 FTS3 또는 FTS4 테이블이 있는 항목을 지원합니다. 이제
@Entity
로 주석 처리된 클래스에@Fts3
또는@Fts4
주석을 추가하여 매핑 전체 텍스트 검색 테이블이 있는 클래스를 선언할 수 있습니다. 추가 맞춤설정을 위한 FTS 옵션은 주석의 메서드를 통해 사용할 수 있습니다. b/62356416 - View: 이제 Room에서 @DatabaseView 주석을 사용하여 저장된 쿼리로 클래스(view라고도 함)를 선언할 수 있습니다. (b/67033276)
- Auto Value: 이제 Room에서 AutoValue 주석이 달린 클래스를 항목과 POJO로 선언할 수 있습니다. 이제 auto value로 주석 처리된 클래스의 추상 메서드에서 Room 주석
@PrimaryKey
,@ColumnInfo
,@Embedded
,@Relation
을 선언할 수 있습니다. 이러한 주석을@CopyAnnotations
와 함께 제공해야 Room에서 제대로 이해할 수 있습니다. (b/62408420) - 추가 Rx 반환 유형 지원:
@Insert
,@Delete
,@Update
로 주석 처리된 DAO 메서드가 이제Completable
,Single<T>
및Maybe<T>
Rx 반환 유형을 지원합니다. (b/63317956) @Relation
이 포함된 변경할 수 없는 유형: 이전에는 Room에서@Relation
주석이 달린 필드를 설정할 수 있어야 했지만 지금은 생성자 매개변수로 허용됩니다.enableMultiInstanceInvalidation
:RoomDatabase.Builder
의 새 API로, 동일한 데이터베이스 파일을 사용하는 여러 RoomDatabase 인스턴스에서 무효화를 사용 설정합니다. 이 다중 인스턴스 무효화 메커니즘은 여러 프로세스에 걸쳐 작동합니다. (b/62334005)fallbackToDestructiveMigrationOnDowngrade
:RoomDatabase.Builder
의 새 API로, 다운그레이드가 발생하면 자동으로 데이터베이스를 재생성합니다. b/110416954ignoredColumns
: 무시된 필드를 이름별로 나열하는 데 사용할 수 있는@Entity
주석의 새 API입니다. 항목의 상속된 필드를 무시할 때 유용합니다. (b/63522075)
API/동작 변경사항
RoomDatabase
의mCallback
및mDatabase
가 이제@Deprecated
상태가 되었으며 Room의 다음 메이저 버전에서 삭제될 예정입니다. (b/76109329)
버그 수정
- Room에서 초기화 중에 손상된 데이터베이스 또는 잘못된 이전으로부터 제대로 복구하지 못하는 두 가지 문제를 해결했습니다. (b/111504749, b/111519144)
- 이제 Room에서 필드를
vars
로 선언할 필요가 없도록 데이터 클래스에서 Kotlin의 기본 생성자를 적절히 사용합니다. (b/105769985)
버전 2.0.0
버전 2.0.0
2018년 10월 1일
androidx.room 2.0.0
이 2.0.0-rc01에서 변경사항 없이 출시되었습니다.
버전 2.0.0-rc01
2018년 9월 20일
androidx.room 2.0.0-rc01
이 2.0.0-beta01에서 변경사항 없이 출시되었습니다.
버전 2.0.0-beta01
2018년 7월 2일
API/동작 변경사항
- 쿼리가 실행되는 위치의 맞춤설정을 허용하도록
RoomDatabase.Builder.setQueryExecutor()
가 추가되었습니다. - RxJava2
Observable
지원이 추가되었습니다. - 생성된 DAO 및 데이터베이스 구현이 최종 마무리되었습니다.
버그 수정
- '필드의 getter를 찾을 수 없음' 오류에 클래스/필드 이름을 지정합니다. (b/73334503)
- Room 이전 버전과의 RoomOpenHelper 하위 호환성을 수정했습니다. (b/110197391)
AndroidX 이전 종속 항목
Room의 AndroidX 이전 버전의 경우 다음 종속 항목을 포함합니다.
dependencies {
def room_version = "1.1.1"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
// optional - RxJava support for Room
implementation "android.arch.persistence.room:rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "android.arch.persistence.room:guava:$room_version"
// Test helpers
testImplementation "android.arch.persistence.room:testing:$room_version"
}
버전 1.1.1
버전 1.1.1
2018년 6월 19일
Room 1.1.1
은 Room 1.1.1-rc1
과 동일합니다.
버전 1.1.1-rc1
2018년 5월 16일. 이전을 사용 중인 경우 Room 1.1.0
대신 1.1.1-rc1
을 사용하는 것이 좋습니다.
Room에서 이전 후 초기화를 제대로 처리하지 못하는 버그를 수정했습니다. b/79362399
버전 1.1.0
버전 1.1.0-beta3
2018년 4월 19일
버그 수정
- Kotlin POJO에서 자바에 정의된 관계 항목을 참조할 때 발생하는 컴파일 오류가 수정되었습니다. b/78199923
버전 1.1.0-beta2
2018년 4월 5일
버그 수정
Room의 Rx
Single
및Maybe
구현에서 예정보다 빨리 쿼리를 재활용하면 반환된Single
또는Maybe
인스턴스에 관찰자를 2개 이상 추가하는 경우 문제가 발생하는 중요한 버그를 수정했습니다. (b/76031240)[RoomDatabase.clearAllTables][ref-clearAllTables]는 트랜잭션 내에서 호출되는 데이터베이스를
VACUUM
하지 않습니다. (b/77235565)
버전 1.1.0-beta1
2018년 3월 21일
API 변경사항
- API 검토 의견에 따라
@RawQuery
에서 더 이상 쿼리 매개변수로String
이 전달되도록 허용하지 않습니다. [SupportSQLiteQuery][ref-SupportSQLiteQuery]를 사용해야 합니다. 인수 지원으로 [SupportSQLiteQuery][ref-SupportSQLiteQuery]의 인스턴스를 쉽게 만들려면 [SimpleSQLiteQuery][ref-SimpleSQLiteQuery]를 참조하세요. - RoomDatabase.Builder의 [fallbackToDestructiveMigrationFrom][ref-fallbackToDestructiveMigrationFrom] 메서드에서 이제
vararg Integer
대신vararg int
를 허용합니다.
버그 수정
- 이제 [RoomDatabase.clearAllTables][ref-clearAllTables]에서 WAL 체크포인트를 설정하고 데이터베이스를
VACUUM
하여 운영체제에 공간을 다시 반환하려고 시도합니다. - 이제 POJO에서
Embedded
필드 또는Relation
을 통해 하나 이상의 항목을 참조하는 한 [@RawQuery
][ref-RawQuery]는observedEntities
속성에 POJO를 허용합니다. (b/74041772) - Paging: Room의 DataSource 구현에서 이제 다중 테이블 종속 항목(예: 관계, 조인)을 올바르게 처리합니다. 이전에는 새로운 결과를 트리거하지 못 하거나 컴파일에 실패했습니다. (b/74128314 참조)
버전 1.1.0-alpha1
2018년 1월 22일
새로운 기능
RawQuery
: 이 새로운 API를 사용하면@Dao
메서드가 SQL을 쿼리 매개변수로 받을 수 있습니다. (b/62103290, b/71458963)fallBackToDestructiveMigrationsFrom
:RoomDatabase.Builder
의 이 새로운 API를 사용하면 fallbackToDestructiveMigration에 비해 파괴적인 이전이 허용되는 스키마 버전부터 세밀하게 제어할 수 있습니다. (b/64989640)- Room에서는 이제 최신 Paging API(alpha-4+)만 지원하고 사용되지 않는
LivePagedListProvider
의 지원을 중단합니다. 새로운 Room 알파를 사용하려면 Pagingalpha-4
이상을 사용하고, 아직 전환하지 않은 경우LivePagedListProvider
에서LivePagedListBuilder
로 전환해야 합니다.
버그 수정
- Kotlin Kapt 유형의 지원이 향상되었습니다. b/69164099
- 필드 순서가 더 이상 스키마를 무효화하지 않습니다. b/64290754