Home > Net >  android Room with kotlin value class?
android Room with kotlin value class?

Time:10-04

I'm trying to use a room entity with a value class:

@JvmInline
value class UserToken(val token: String)

and the entity:

@Entity(tableName = TABLE_AUTH_TOKEN)
data class TokenEntity(
  @PrimaryKey val id: Int = 0,
  val token: UserToken
)

I get the following error:

error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).
public final class TokenEntity {
             ^

is it even possible to use room with value class? I couldn't find anything about this. thanks

CodePudding user response:

UserToken always will have only one attribute? In this case, you don't need two classes, just use token: String directly on your entity class;

If you really need keep this class, you have two options:

  • TypeConverter, where you basically will convert the object into a json, and save as string in the database;

  • Relation, where you will transform the UserToken in a entity, and on TokenEntity save the tokenId.

CodePudding user response:

I think yes if you can provide a type converter for it to change it to some sort of primitive data type (int , string, long ...etc) when it needs to be stored, and to change it back to its class type when it's fetched from database.

You can read about Type Converters from here

Referencing complex data using Room

other than that, your other class should be an entity and bind both your entities together using a Relation.

at least that's what I know about how to use Room.

  • Related