我可以将一个TypeConverter用于不同的对象类型吗?

时间:2018-03-21 04:09:03

标签: android database android-room android-architecture-components

到目前为止,存储在房间数据库中我已经为每个类使用了类型转换器。像这样:

@SerializedName("sidebar")
@Expose
@TypeConverters(SidebarConverter.class)
private Sidebar sidebar;
@SerializedName("splash")
@Expose
@TypeConverters(SplashConverter.class)
private Splash splash;
@SerializedName("overview")
@Expose
@TypeConverters(OverviewConverter.class)
private Overview overview;
@SerializedName("home")
@Expose
@TypeConverters(HomeConverter.class)
private Home home;
@SerializedName("portfolio")
@Expose
@TypeConverters(PortfolioConverter.class)
private Portfolio portfolio;
@SerializedName("team")
@Expose
@TypeConverters(TeamConverter.class)
private Team team;

我想知道在数据库中单独使用一个TypeConverter是否更方便。

2 个答案:

答案 0 :(得分:3)

您可以在单个类中定义所有转换器,如下所示:

public class DateTypeConverter {

    @TypeConverter
    public static Date toDate(Long value) {
        return value == null ? null : new Date(value);
    }

    @TypeConverter
    public static Long toLong(Date value) {
        return value == null ? null : value.getTime();
    }
}

然后使用@TypeConverter这样的注释在您的会议室数据库上设置此转换器,该注释在任何@Entity类上全局工作。您不需要在实体类中单独定义@TypeConverter < / p>

@Database(entities = {Product.class}, version = 1)
@TypeConverters({DateTypeConverter.class})
public abstract class MyDatabase extends RoomDatabase {
    public abstract ProductDao productDao();
}

注意我们在数据库定义中添加了一个名为@TypeConverters的新注释,以便引用我们可以拥有的不同转换器(您可以用逗号分隔并添加其他转换器)。

答案 1 :(得分:0)

这里的问题是Room的代码生成尝试查找特定类型,如果您尝试制作通用转换器,则无法生成适当的方法。 但是,如果在您的情况下,将数据转换为json进行存储是合适的,您可以像这样减少样板:

@TypeConverter
fun toSomething(value: String): Something = fromJson(value)

@TypeConverter
fun fromSomething(value: Something): String = toJson(value)

fromJson和toJson是通用的,例如它们看起来像这样。无论何时需要添加类型,只需采用上述两种方法,并将“Something”替换为您的类型。如果你有很多要转换的类,你甚至可以很容易地编码这样的TypeConverters来满足Room的代码需求。

inline fun <reified T> fromJson(value: String): T {
    val jsonAdapter = moshi.adapter(T::class.java)
    return jsonAdapter.fromJson(value)
}

inline fun <reified T> toJson(value: T): String {
    val jsonAdapter = moshi.adapter(T::class.java)
    return jsonAdapter.toJson(value)
}
相关问题