Room Persistence: Error:Entities and Pojos must have a usable public constructor

前端 未结 24 1752
长发绾君心
长发绾君心 2020-12-01 09:05

I\'m converting a project to Kotlin and I\'m trying to make my model (which is also my entity) a data class I intend to use Moshi to convert the JSON responses from the API<

相关标签:
24条回答
  • 2020-12-01 09:12

    Don't use to dataclass,use normal class instead. This method will solve problem

    0 讨论(0)
  • 2020-12-01 09:13

    I had the same issue. You can move the @Ignore fields to class body. For example :

    @Entity(tableName = "movies")
    data class MovieKt(
        @PrimaryKey
        var id : Int,
        var title: String
    ){
        //here
        @Ignore var overview: String
     }
    
    0 讨论(0)
  • 2020-12-01 09:13

    I think that a good option for resolve it is:

    @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
    )
    
    0 讨论(0)
  • 2020-12-01 09:14

    Same bug, much stranger solution: Do not return cursor using reactivex Maybe<Cursor> on your Dao. Flowable, Single, and Observable did not work either.

    Simply bite the bullet and make the reactive call outside the Dao request. Before:

    @Dao
    interface MyDao{
        @Query("SELECT * FROM mydao")
        fun getCursorAll(): Flowable<Cursor>
    }
    

    After:

    @Dao
    interface MyDao{
        @Query("SELECT * FROM mydao")
        fun getCursorAll(): Cursor
    }
    

    Meta:

    Android Studio 3.2
    Build #AI-181.5540.7.32.5014246, built on September 17, 2018
    JRE: 1.8.0_152-release-1136-b06 x86_64
    JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
    macOS 10.12.6
    
    0 讨论(0)
  • 2020-12-01 09:15

    Today I was having this problem. I used @Ignore, that is why I got the error. To solve this I created a secondary constructor. So my code looks something like this:

    @Entity(tableName = "profile")
    data class Profile(
      @field:SerializedName("id") @PrimaryKey @ColumnInfo(name = "id") var id:Long,
      @field:SerializedName("foo") @ColumnInfo(name = "foo") var foo:String?,
      @field:SerializedName("bar") @Ignore var Bar:String?
    ){
       constructor(id:Long, foo:String) : this(id, foo, null)
    }
    

    This worked for me.

    0 讨论(0)
  • 2020-12-01 09:15

    For me, I was using 'lat' & 'long' as a variable name in the data(Entity) class for kotlin so renaming to latitude & longitude it worked.

    Not working:

    @Entity(tableName = "table_User")
    data class User(@PrimaryKey var userId : Int, @ColumnInfo(name = "first_name") 
    var firstName: String
                , @ColumnInfo(name = "last_name") var lastName: String
                , @ColumnInfo(name = "password") var password: String
                , @ColumnInfo(name = "dob") var dob: Long
                , @ColumnInfo(name = "address") var address: String
                , @ColumnInfo(name = "lat") var latitude: Double
                , @ColumnInfo(name = "long") var longitude: Double) {
    
    }
    

    Working:

    @Entity(tableName = "table_User")
    data class User(@PrimaryKey var userId : Int, @ColumnInfo(name = "first_name") 
    var firstName: String
                , @ColumnInfo(name = "last_name") var lastName: String
                , @ColumnInfo(name = "password") var password: String
                , @ColumnInfo(name = "dob") var dob: Long
                , @ColumnInfo(name = "address") var address: String
                , @ColumnInfo(name = "latitude") var latitude: Double
                , @ColumnInfo(name = "longitude") var longitude: Double) {
    
    }
    
    0 讨论(0)
提交回复
热议问题