Hasan Al-Qaisi
Hasan Al-Qaisi

Reputation: 246

TypeConverter function never used room database

I have list of custom object that i wanna save it in the database.

So I have to use TypeConverters to make this possible.

My problem that i get an error when I implement the functionality and I noticed

that a function annotated with TypeConverter never used

Here's the error:

A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
error: The columns returned by the query does not have the fields [avatar,email,first_name,id,last_name] in com.hraa.fakeusers.model.UserData even though they are annotated as non-null or primitive. Columns returned by the query: [data]
    public abstract androidx.lifecycle.LiveData<java.util.List<com.hraa.fakeusers.model.UserData>> getUsers();

And here's the code:

@Entity(tableName = USER_DATA_TABLE)
data class DataModel(
    val data: List<UserData>,
    val page: Int,
    val per_page: Int,
    val total: Int,
    val total_pages: Int
) {
    @PrimaryKey(autoGenerate = true)
    var id: Int? = null
}

data class UserData(
    val avatar: String,
    val email: String,
    val first_name: String,
    val id: Int,
    val last_name: String
)

class Converters {

    @TypeConverter
    fun toUsersData(value: String): List<UserData> {
        val type = object : TypeToken<List<UserData>>() {}.type
        return Gson().fromJson(value, type)
    }

    @TypeConverter
    fun fromUsersData(usersData: List<UserData>): String {
        return Gson().toJson(usersData)
    }
}

@Database(entities = [DataModel::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase: RoomDatabase() {

    abstract fun dataDao(): DataDao
}

    @Dao
interface DataDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertData(data: DataModel)

    @Delete
    suspend fun deleteData(data: DataModel)

    @Query("SELECT data FROM USER_DATA_TABLE")
    fun getUsers(): LiveData<List<UserData>>
}

Note: toUsersData() function never used.. I don't know why.

Upvotes: 0

Views: 405

Answers (1)

sergiy tykhonov
sergiy tykhonov

Reputation: 5103

Note: toUsersData() function never used

How can you be sure of that? My guess is that this function could work well, but you have two type's transformations here:

@Query("SELECT data FROM USER_DATA_TABLE")
fun getUsers(): LiveData<List<UserData>>

Transformation #1 (row level). Input: String (saved in db). Output: data (List). That should be processed well thanks to your toUsersData() method (may be not, I've not checked, but it seems it should do)

Transformation #2 (row level). Input: data (List). Output: UserData (According to your desired return type). For that Room doesn't know how to do this transformation, so you have en error.

To check if your toUsersData() really works you can test next query:

@Query("SELECT * FROM USER_DATA_TABLE")
fun getUsers(): LiveData<List<DataModel>>

If your build is successful, then there is no problem with this function. You can also find this function in Java-class, that was autogenerated by Room during build.

You can try to add another data class:

data class UserDataList(
    val data: List<UserData>
)

and change your data method to:

@Query("SELECT data FROM USER_DATA_TABLE")
fun getUsers(): LiveData<List<UserDataList>>

Upvotes: 1

Related Questions