방은 않습니다 하지 적어도되지 때까지, 좋은 마이그레이션 시스템을 가지고 2.1.0-alpha03
.
따라서 더 나은 마이그레이션 시스템을 갖출 때까지 회의실에서 쉽게 마이그레이션 할 수있는 몇 가지 해결 방법이 있습니다.
@Database(createNewTables = true)
또는 같은 방법이 없기 MigrationSystem.createTable(User::class)
때문에 가능한 유일한 방법은 실행하는 것입니다.
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
당신의 migrate
방법 내부 .
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))")
}
}
위의 SQL 스크립트 를 얻으려면 4 가지 방법이 있습니다.
1. 혼자서 쓰기
기본적으로 Room에서 생성하는 스크립트와 일치하는 위의 스크립트를 작성해야합니다. 이 방법은 가능하지만 불가능합니다. (50 개의 필드가 있다고 가정)
2. 스키마 내보내기
주석 exportSchema = true
안에 포함하면 @Database
Room은 프로젝트 폴더의 / schemas 내에 데이터베이스 스키마를 생성합니다. 사용법은
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
//...
}
build.grade
앱 모듈의 아래 줄을 포함했는지 확인하십시오.
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
프로젝트를 실행하거나 빌드하면 2.json
Room 데이터베이스 내에 모든 쿼리가 포함 된 JSON 파일 이 제공됩니다.
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "325bd539353db508c5248423a1c88c03",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
따라서 위의 내용 createSql
을 migrate
메서드에 포함 할 수 있습니다 .
3. AppDatabase_Impl에서 쿼리 가져 오기
스키마를 내 보내지 않으려면 AppDatabase_Impl.java
파일 을 생성 할 프로젝트를 실행하거나 빌드하여 쿼리를 가져올 수 있습니다 . 지정된 파일 내에서 가질 수 있습니다.
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
createAllTables
메서드 내에 모든 엔터티의 생성 스크립트가 있습니다. 당신은 그것을 얻고 당신의 migrate
방법에 포함시킬 수 있습니다 .
4. 주석 처리.
당신이 추측 할 수 있듯이, 방은 위에서 언급 한 모든를 생성 schema
하고, AppDatabase_Impl
당신이 추가 주석 처리 컴파일 시간 내에와의 파일
kapt "androidx.room:room-compiler:$room_version"
즉, 동일한 작업을 수행하고 필요한 모든 쿼리를 생성하는 고유 한 주석 처리 라이브러리를 만들 수 있습니다.
아이디어는 @Entity
및의 Room 주석에 대한 주석 처리 라이브러리를 만드는 것입니다 @Database
. @Entity
예를 들어 주석이 달린 클래스를 살펴보십시오 . 따라야 할 단계입니다.
- 새로
StringBuilder
만들고 "CREATE TABLE IF NOT EXISTS"를 추가합니다.
- 의 필드 에서
class.simplename
또는 tableName
필드 별로 테이블 이름을 가져옵니다 @Entity
. 당신의StringBuilder
- 그런 다음 클래스의 각 필드에 대해 SQL 열을 만듭니다. 필드 자체 또는
@ColumnInfo
주석으로 필드의 이름, 유형, 널 허용 여부를 가져옵니다 . 모든 필드 id INTEGER NOT NULL
에 대해 열 스타일을 StringBuilder
.
- 다음을 통해 기본 키 추가
@PrimaryKey
- 추가
ForeignKey
하고 Indices
존재하는 경우.
- 완료 후 문자열로 변환하고 사용하려는 새 클래스에 저장하십시오. 예를 들어 아래와 같이 저장합니다.
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
그런 다음 다음과 같이 사용할 수 있습니다.
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
나는 당신이 체크 아웃 할 수 있고 당신의 프로젝트에서도 사용할 수있는 그런 라이브러리를 직접 만들었다. 내가 만든 라이브러리가 꽉 차지 않았고 테이블 생성에 대한 요구 사항 만 충족합니다.
더 나은 마이그레이션을위한 RoomExtension
RoomExtension을 사용하는 응용 프로그램
도움이 되었기를 바랍니다.
최신 정보
이 답변을 작성 2.1.0-alpha03
했을 때 룸 버전은 였고 개발자에게 이메일을 보냈을 때 응답을 받았습니다.
더 나은 마이그레이션 시스템이있을 것으로 예상됩니다. 2.2.0
불행히도 우리는 여전히 더 나은 마이그레이션 시스템이 부족합니다.