android - Android Room:将 json 结果转换为 db 对象的有效方法
问题描述
问题
我有一个从 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;
}
为了尽量减少冗余和重复,我希望创建这样的模式
@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
}
如您所见,当我调用 DAO 方法访问数据库时,我不能直接传入 pojo 对象(除非我对此有误)。我相信我需要将对象转换为与数据库实体模型匹配的对象。
问题
Android 框架是否提供了一种从 POJO 转换为数据库模型对象的自然方式?除了自己手动转换之外,还有其他方法吗?
我尝试过的事情
- 我知道我可以在我的 DAO 接口中的方法内实现转换。但随后我将不得不创建一个新对象并手动设置所有值。
- 我最初认为类型转换器会起作用,但它们似乎可以转换单个列。
解决方案
您所要做的就是@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;
}
推荐阅读
- android - 运行 React-native 应用程序后 JAVA_HOME 未设置错误
- c++ - 代码仅输出 std::vector 一次而不是多次输出
- javascript - 如何使用 PHP(无 Javascript)接收服务器端事件?
- sql - 使用独立 SP 重新创建夜间快照工作表
- r - 如何优化递归函数以查找所有排列?
- mysql - 休眠连接泄漏
- c# - OpenFileDialog 未在 Visual Studio 2017 中显示(FolderBrowserDialog 也不显示!)
- java - 如何使用 Selenium 和 Java 单击登录按钮/链接 data-testid
- javascript - 如何跨多个客户端在服务器中维护一个数据结构?
- r - R将给定数字序列划分为各种组合