android with 방의 지속성:오류:엔터티와 Pojos에 사용 가능한 공용 생성자가 있어야합니다.




room database developer android (8)

전에도 비슷한 문제가있었습니다.

먼저 apply plugin: 'kotlin-kapt' 업데이트 / 추가했습니다 apply plugin: 'kotlin-kapt' 를 사용하여 그라디언트를 적용하십시오.

다음으로, 나는 gradle에서 annotationProcessor 대신에 그것을 사용했다.

kapt "android.arch.persistence.room:compiler:1.0.0-alpha4"

마지막으로 불변의 데이터 클래스를 만드는 것이 었습니다.

@Entity(tableName = "movies")
data class MovieKt(
    @PrimaryKey
    val id : Int,
    val title: String,
    val overview: String,
    val poster_path: String,
    val backdrop_path: String,
    val release_date: String,
    val vote_average: Double,
    val isFavorite: Int
)

최신 정보:

이 솔루션은 동일한 Android 모듈에서 Model 클래스와 Database 클래스를 가질 때 작동합니다. Android 라이브러리 모듈에 모델 클래스가 있고 기본 모듈의 나머지 코드가있는 경우 Room에서 해당 클래스를 인식하지 못합니다.

저는 프로젝트를 Kotlin으로 변환하고 있습니다. 내 모델 (내 개체이기도합니다)을 API에서 JSON 응답을 변환하기 위해 Moshi를 사용하려는 데이터 클래스로 만들려고합니다.

@Entity(tableName = "movies")
data class MovieKt(
    @PrimaryKey
    var id : Int,
    var title: String,
    var overview: String,
    var poster_path: String,
    var backdrop_path: String,
    var release_date: String,
    var vote_average: Double,
    var isFavorite: Int
)

다음 오류의 앱 원인을 만들 수 없습니다.

엔티티와 Pojos에는 사용 가능한 public 생성자가 있어야합니다. 빈 생성자 또는 매개 변수가 필드와 일치하는 생성자 (이름 및 유형)를 가질 수 있습니다. 입력란을 찾을 수 없습니다.

내가 찾은 사례가 this 멀지는 않습니다.

그것을 해결하는 방법에 대한 아이디어?


나를 위해 일한 것 :

@Entity(tableName = "movies")
data class MovieKt(
    @PrimaryKey
    var id : Int? = 0,
    var title: String? = "",
    var overview: String? = "",
    var poster_path: String? = "",
    var backdrop_path: String? = "",
    var release_date: String? = "",
    var vote_average: Double? = 0.0,
    var isFavorite: Int? = 0
)

대신 변수 이름을 변경해보십시오.


나는이 문제에 OP와 같은 비 기본 항목과 관련된 목록을 포함하는 엔티티 (모든 필드가 올바르게 초기화 된 var s가 여기에 나와 있습니다. 예 :

@Entity(tableName = "fruits")
data class CachedFruitEntity(
        @PrimaryKey var id: Long = 0L,
        @Embedded(prefix = "buyer_") var buyerEntity: CachedBuyerEntity? = null
        @TypeConverters(VendorsConverter::class)
        var vendorEntities: List<CachedVendorEntity?> = listOf()))

즉, 임베디드 필드가 있고 실제로 필요한 것은 납품 업체 엔티티 목록에 대한 유형 변환기였습니다 (컴파일러가 일반적인 Error:(58, 31) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. 하지 않음 Error:(58, 31) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. 따라서이 솔루션은 내 대답 과 매우 유사합니다.

Google 아키텍처 구성 요소 github 스레드 는이 오해의 소지가있는 오류에 대한 자세한 정보가 있지만 문제가 아직 해결되지 않았는지 확실하지 않습니다.


다음과 같이 2 차 생성자를 지정해야합니다.

@Entity(tableName = "movies")
data class MovieKt(
    @PrimaryKey
    var id : Int,
    var title: String,
    var overview: String,
    var poster_path: String,
    var backdrop_path: String,
    var release_date: String,
    var vote_average: Double,
    var isFavorite: Int
) {
    constructor() : this(0, "", "", "", "", "", 0.0, 0)
}    

https://issuetracker.google.com/issues/62851733

나는 이것이 @ Relation의 투영 버그 인 것을 발견했다! Kotlin 언어 문제가 아닙니다. 기반 구글 GithubBrowserSample 자바도 happend 오류지만, 다른 오류 메시지.

아래는 내 kotlin 코드입니다.

data class UserWithCommunities(
        @Embedded
        var user: User = User(0, null),

        @Relation(parentColumn = "id",
                entityColumn = "users_id",
                entity = CommunityUsers::class,
                projection = arrayOf("communities_id")) // delete this line.
        var communityIds: List<Int> = emptyList()
)

권리:

data class UserWithCommunities(
        @Embedded
        var user: User = User(0, null),

        @Relation(parentColumn = "id",
                entityColumn = "users_id",
                entity = CommunityUsers::class)
        var communityList: List<CommunityUsers> = emptyList()
)

나는 또한이 문제가 있었지만 문제는 내가 타입 변환기를 가지고있는 프로퍼티에 @Embedded 어노테이션을 추가했다는 것을 깨달았 기 때문에 같은 문제가있는 사람이라면 모델 클래스의 프로퍼티 선언을주의 깊게 체크해야하고 @ 포함 된 주석은 연관된 유형 변환기가있는 특성에 없습니다.






android-architecture-components