Android Room:将json结果转换为db对象的有效方法

Kev*_*Lam 8 android normalization type-conversion pojo android-room

问题

我有一个从API调用解析的POJO,看起来像这样

public class Article {

  public Long id;

  @Expose
  @SerializedName("section")
  public String section;

  @Expose
  @SerializedName("title")
  public String title;

  @Expose
  @SerializedName("topics")
  public List<String> topics;

  @Expose
  @SerializedName("media")
  public List<Media> media;
}
Run Code Online (Sandbox Code Playgroud)

为了最大限度地减少冗余和重复,我希望创建一个这样的模式

@Entity(foreignKeys = { 
          @ForeignKey(entity = Article.class, parentColumns = "id", childColumns = "articleId"), 
          @ForeignKey(entity = Topic.class, parentColumns = "id", childColumns = "topicId"),
          @ForeignKey(entity = Media.class, parentColumns = "id", childColumns = "mediaId")
}
public class Articles {

    @PrimaryKey
    public Long articleId; 

    @ColumnInfo(name = "topic_id")
    public Long topicId;

    @ColumnInfo(name = "media_id")
    public Long mediaId;
}

@Entity
public class Article {
    // Left out
}

@Entity
public class Media {
    // Left out
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当我调用DAO方法来访问数据库时,我不能直接传入pojo对象(除非我弄错了).我相信我需要将对象转换为与数据库实体模型匹配的对象.

Android Framework是否提供了从POJO转换为数据库模型对象的自然方式?有没有办法做到这一点,除了自己手动转换它?

我试过的事情

  • 我知道我可以在DAO接口中的方法内实现转换.但是我必须创建一个新对象并手动设置所有值.
  • 我最初认为typeconverters会工作,但他们似乎转换单个列.

Ati*_*Asi 8

你所要做的就是@Embedded为你的 POJO(Model Class)使用注解,它会引用另一个类。然后创建一个类型转换器类。

 @Embedded(prefix = "media")
private Meida media;

@TypeConverters({TypeConvertorClass.class})
@Database(entities = {Article .class,Media.class}, version = 1, exportSchema = false)
public abstract class `DataBaseExample` extends RoomDatabase {
}


public class Converters {
    @TypeConverter
    public static ArrayList<String> fromString(String value) {
        Type listType = new TypeToken<ArrayList<String>>() {}.getType();
        return new Gson().fromJson(value, listType);
    }

    @TypeConverter
    public static String fromArrayLisr(ArrayList<String> list) {
        Gson gson = new Gson();
        String json = gson.toJson(list);
        return json;
    }
}


    public class TypeConvertorClass {
    @TypeConverter
    public static Media getMedia(String longId) {
        return longId== null ? null : new Meida();
    }

}
  @Entity(tableName = "Article")
    public class Article {
        @ColumnInfo (name = "article_id")
        public Long id;

        @Expose
    @SerializedName("section")
    public String section;

    @Expose
    @SerializedName("title")
    public String title;

    @Expose
    @SerializedName("topics")
    public List<String> topics;

   @Embedded(prefix = "media") // We need relation to Media table
    @Expose
    @SerializedName("media")
    public List<Media> media;
}

public class Media {
    @ColumnInfo (name = "media_id")
    public Long id;
}
Run Code Online (Sandbox Code Playgroud)