programing

회의실 - 주석 프로세서에 스키마 내보내기 디렉토리가 제공되지 않으므로 스키마를 내보낼 수 없습니다.

projobs 2022. 8. 27. 23:10
반응형

회의실 - 주석 프로세서에 스키마 내보내기 디렉토리가 제공되지 않으므로 스키마를 내보낼 수 없습니다.

Android Database Component Room을 사용하고 있습니다.

모든 것을 설정했지만 컴파일할 때 Android Studio에서 다음과 같은 경고가 나타납니다.

주석 프로세서에 스키마 내보내기 디렉토리가 제공되지 않으므로 스키마를 내보낼 수 없습니다. 하다, 하다, 하다, 하다, 하다, 이렇게 할 수 요.room.schemaLocationexportSchema false 。

제가 알기로는 DB 파일이 저장될 위치입니다.

에에어 ?향 ?? ????여기서의 베스트 프랙티스는 무엇입니까? 「 「 」 「 」 )를 사용해야 합니까?false(표준)

문서에 따르면:

주석 프로세서 인수(room.schemaLocation)를 설정하여 Room에게 스키마를 폴더로 내보내도록 지시할 수 있습니다.필수는 아니지만 코드베이스에 버전 이력을 저장하는 것이 좋습니다.또한 이 파일을 버전 관리 시스템에 커밋해야 합니다(단, 앱과 함께 출하하지 마십시오).

없고 '스키마'를 붙이면 .exportSchema = falseyour RoomDatabase, , , , , , , , , , , , , , , , , , , , , , , , , , , , .

@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
   //...
}

아래의 @mikejonesguy 답변을 따르면 문서:)에 기재되어 있는 베스트 프랙티스를 따릅니다.기본적으로는,.json../app/schemas/ 있어요그리고 그것은 다음과 같습니다.

{
  "formatVersion": 1,
  "database": {
    "version": 1,
    "identityHash": "53db508c5248423325bd5393a1c88c03",
    "entities": [
      {
        "tableName": "sms_table",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message` TEXT, `date` INTEGER, `client_id` INTEGER)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER"
          },
          {
            "fieldPath": "message",
            "columnName": "message",
            "affinity": "TEXT"
          },
          {
            "fieldPath": "date",
            "columnName": "date",
            "affinity": "INTEGER"
          },
          {
            "fieldPath": "clientId",
            "columnName": "client_id",
            "affinity": "INTEGER"
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"53db508c5248423325bd5393a1c88c03\")"
    ]
  }
}

제 이해가 맞다면 데이터베이스 버전을 업데이트할 때마다 이러한 파일을 얻을 수 있기 때문에 쉽게 DB 이력을 추적할 수 있습니다.

서서 build.gradlemodule, 이을 '어플리케이션모듈'에 합니다.defaultConfig 「」)android를 참조해 주세요.그러면 스키마가 에 써집니다.schemas프로젝트 폴더의 하위 폴더.

javaCompileOptions {
    annotationProcessorOptions {
        arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
    }
}

다음과 같이 합니다.

// ...

android {
    
    // ... (compileSdkVersion, buildToolsVersion, etc)

    defaultConfig {

        // ... (applicationId, miSdkVersion, etc)
        
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }
   
    // ... (buildTypes, compileOptions, etc)

}

// ...

코틀린? 간다.

android {

    // ... (compileSdkVersion, buildToolsVersion, etc)

    defaultConfig {

        // ... (applicationId, miSdkVersion, etc)

        kapt {
            arguments {
                arg("room.schemaLocation", "$projectDir/schemas")
            }
        }
    }

    buildTypes {
        // ... (buildTypes, compileOptions, etc)
    }
}

//...

플러그인에 대해 잊지 마십시오.

apply plugin: 'kotlin-kapt'

Kotlin 주석 프로세서의 자세한 내용은 다음 Kotlin 문서를 참조하십시오.

위의 답변은 정답입니다.이 버전은 따르기 쉽습니다.

"Schema export 디렉토리가 주석 프로세서에 제공되지 않습니다." 때문에 스키마 내보내기를 위한 디렉토리를 제공해야 합니다.

순서 [1] RoomDatabase를 확장하는 파일에서 행을 다음과 같이 변경합니다.

`@Database(entities = ???.class,version = 1, exportSchema = true)`

또는

`@Database(entities = ???.class,version = 1)` 

(기본값이 항상 true이기 때문에)

순서 [2] build.gradle (프로젝트: ?)에서?) 파일의 defaultConfig{ }(안드로이드{}의 큰 섹션 내)에 javaCompileOptions{} 섹션을 추가합니다.이 섹션은 다음과 같습니다.

         android{
                defaultConfig{
                      //javaComplieOptions SECTION
                      javaCompileOptions {
                            annotationProcessorOptions {
                                     arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
                            }
                       }
                      //Other SECTION
                      ...
                }
         }

$projectDir:는 변수 이름이므로 변경할 수 없습니다.독자적인 프로젝트 디렉토리를 취득합니다.

schemas: 문자열입니다. 원하는 문자열로 변경할 수 있습니다.예를 들어 다음과 같습니다."$projectDir/MyOwnSchemas".toString()

@subjonesguy 답변은 완벽합니다.룸의 이행을 테스트하는 경우(권장)를 위해 스키마 위치를 소스 세트에 추가합니다.

build.gradle 파일에서 생성된 스키마 JSON 파일을 저장할 폴더를 지정합니다.스키마를 업데이트하면 모든 버전에 하나씩 여러 JSON 파일이 생성됩니다.생성된 모든 파일을 소스 제어에 커밋해야 합니다.다음에 버전 번호를 다시 늘리면 Room에서 테스트에 JSON 파일을 사용할 수 있습니다.

build.gradle

android {

    // [...]

    defaultConfig {

        // [...]

        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }

    // add the schema location to the source sets
    // used by Room, to test migrations
    sourceSets {
        androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
    }

    // [...]
}

사용하고 있다.kts그래들 파일(Kotlin Gradle DSL) 및kotlin-kaptIvanov Maksim의 답변을 사용하면 스크립트 컴파일 오류가 발생합니다.

Unresolved reference: kapt

제게는 이것밖에 효과가 없었습니다.

android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
            }
        }
    }
}

나처럼 최근 특정 클래스를 다른 패키지로 옮기고 안드로이드 내비게이션을 사용합니다.argType을 새 패키지 주소와 일치하도록 변경하십시오.송신원:

app:argType="com.example.app.old.Item" 

대상:

app:argType="com.example.app.new.Item" 

공식 문서에 따르면 Kotlin 방식:

android {
...
defaultConfig {
    ...
    javaCompileOptions {
        annotationProcessorOptions {
            arguments += mapOf(
                "room.schemaLocation" to "$projectDir/schemas",
                "room.incremental" to "true",
                "room.expandProjection" to "true"
            )
        }
    }
}
}

Kotlin KSP의 경우:

ksp {
    arg('room.schemaLocation', "$projectDir/schemas")
}

아마도 당신은 당신의 방 클래스를 아이에게 추가하지 않았을 것입니다.RoomDatabase에 있어서의 아동반@Database(entities = {your_classes})

언급URL : https://stackoverflow.com/questions/44322178/room-schema-export-directory-is-not-provided-to-the-annotation-processor-so-we

반응형