房间持久性库 - 带有 List<Video> 的嵌套对象,@Embedded 不起作用。

Posted

技术标签:

【中文标题】房间持久性库 - 带有 List<Video> 的嵌套对象,@Embedded 不起作用。【英文标题】:Room Persistence library - Nested Object with List<Video>, @Embedded doesn't work. 【发布时间】:2017-11-08 00:34:06 【问题描述】:

我有一个 VideoList 对象,我想使用房间库保存它,但是当我尝试将 @Embedded 与 public List list = null 一起使用时;它给了我以下错误:错误:(23、24)错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。

VideoList 类如下。

@Entity
public class VideoList 


@PrimaryKey
public String id;

public String title;
public String viewType;
public Integer sortingOrder = null;
public String componentSlug;
public String endPoint = null;

@Embedded
public List<Video> list = null;
public boolean hidden = false; 




Any suggestions? 

【问题讨论】:

我认为@Embedded 只适用于原语,这些东西会进入VideoList 的表中的各个列。 AFAIK,你需要有一个Video 实体,它有自己的表和a foreign key back to the list。 你的答案***.com/questions/44330452/… 你要找的是this 【参考方案1】:

我认为Convertor是这种嵌套列表对象中最好的解决方案。

public class Converter 

public static String strSeparator = "__,__";

@TypeConverter
public static String convertListToString(List<Video> video) 
    Video[] videoArray = new Video[video.size()];
    for (int i = 0; i <= video.size()-1; i++) 
         videoArray[i] = video.get(i);
    
    String str = "";
    Gson gson = new Gson();
    for (int i = 0; i < videoArray.length; i++) 
        String jsonString = gson.toJson(videoArray[i]);
        str = str + jsonString;
        if (i < videoArray.length - 1) 
            str = str + strSeparator;
        
    
    return str;


@TypeConverter
public static List<Video> convertStringToList(String videoString) 
    String[] videoArray = videoString.split(strSeparator);
    List<Video> videos = new ArrayList<Video>();
    Gson gson = new Gson();
    for (int i=0;i<videoArray.length-1;i++)
        videos.add(gson.fromJson(videoArray[i] , Video.class));
    
    return videos;

【讨论】:

我尝试对嵌套对象使用转换器,但处理时间显着增加(甚至比改造响应慢),意味着性能不佳! 我明白了!有趣的。对我来说并没有太大变化。比方说,你是对的,那么你的建议是什么?与@relation 有什么关系? 我没有为这种情况找到更好的解决方法,只是在 Room 上玩一会儿。我目前的工作是使用 Realm,非常好,非常快,而且非常简单。 最好在 convertStringToList 方法中使用 for 循环:for (int i=0;i

以上是关于房间持久性库 - 带有 List<Video> 的嵌套对象,@Embedded 不起作用。的主要内容,如果未能解决你的问题,请参考以下文章

Android 房间持久性库:Upsert

如何在房间持久性库中插入图像?

房间持久性库。删除所有

如何使主键作为房间持久性库的自动增量

具有新线程和数据绑定问题的房间持久库

房间持久化库和内容提供者