首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Android上保存嵌套List<String>在RoomDB中

如何在Android上保存嵌套List<String>在RoomDB中
EN

Stack Overflow用户
提问于 2017-08-03 07:42:50
回答 1查看 14.3K关注 0票数 7

嘿,谷歌有一个使用@Relation的例子

代码语言:javascript
运行
复制
@Entity
 public class Pet {
     int userId;
     String name;
     // other fields
 }
 public class UserNameAndAllPets {
   public int id;
   public String name;
   @Relation(parentColumn = "id", entityColumn = "userId")
   public List<Pet> pets;
 }

是否可以保存字符串列表而不为其创建额外的类。我想避免我的JsonProperty和房间实体之间的不一致性

我们希望有这样的事情

代码语言:javascript
运行
复制
 public class UserNameAndAllPets {
   @JsonProperty("id")
   public int id;
   @JsonProperty("name")
   public String name;
   @Relation(parentColumn = "id")
   @JsonProperty("pets")
   public List<String> pets;
 }

因为我收到以下的Json:

代码语言:javascript
运行
复制
{ 
 "id" : "1",
"name" : "someName",
"pets": ["cat", "dog", "camel"]
}

有人知道解决办法吗?

编辑:

现在,我的示例代码看起来是这样的,但我得到了错误: Error:Type参数必须是带@Entity注解的类或它的集合/数组。

代码语言:javascript
运行
复制
@JsonIgnoreProperties(ignoreUnknown=true)
@Entity(tableName = TABLE_NAME)
public class Item {
    @Ignore public static final String TABLE_NAME = "itemTable";

    @PrimaryKey(autoGenerate = true)
    Long id;
    @JsonProperty("supplierName")
    String supplierName;
    @JsonProperty("eventDescription")
    String eventDescription;
    @JsonProperty("eventDate")
    @TypeConverters(StringListToGsonConverter.class)
    Date date;
    @JsonProperty("carServiceType")
    @TypeConverters(StringListToGsonConverter.class)
    List<String> types;

    public ServiceHistoryItem(Long id, String supplierName, String eventDescription, Date date, List<String> types) {
        this.id = id;
        this.supplierName = supplierName;
        this.eventDescription = eventDescription;
        this.date = date;
        this.types = types;
    }

    public static class StringListToGsonConverter{
        @TypeConverter
        public static List<String> restoreList(String listOfString){
            return new Gson().fromJson(listOfString, new TypeToken<List<String>>() {}.getType());
        }

        @TypeConverter
        public static String saveListOfString(List<String> listOfString){
            return new Gson().toJson(listOfString);
        }

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

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

EDIT2

当保存项Dao无法插入我的实体列表时出现了新的问题,没有理由.尽管错误:参数的类型必须是带有@Entity注解的类或它的集合/数组。

代码语言:javascript
运行
复制
@Dao
interface ItemDao {
    @Query("SELECT * FROM " + Item.TABLE_NAME)
    fun getAll(): LiveData<List<Item>>

    @Query("DELETE FROM " + Item.TABLE_NAME)
    fun deleteAllServiceHistory()

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertNewItem(item: Item)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertNewItems(itemList: List<Item>) // <--- Error

}

Dao的解决方案

如果您正在使用Kotlin,则应该使用ArrayList。

代码语言:javascript
运行
复制
@Insert(onConflict = OnConflictStrategy.REPLACE)
        fun insertNewItems(itemList: ArrayList<Item>)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-03 07:45:09

我也有同样的问题,我用@TypedConverter解决了这个问题。我将列表作为JSONArray.toString保存在db中。

代码语言:javascript
运行
复制
@TypeConverter
public static List<String> restoreList(String listOfString) {
    return new Gson().fromJson(listOfString, new TypeToken<List<String>>() {}.getType());
}

@TypeConverter
public static String saveList(List<String> listOfString) {
    return new Gson().toJson(listOfString);
}

这样,每个List<String>都将被序列化为数据库中的JSONArray。

对于扩展RoomDatabase的db类,您必须声明使用哪个类与@TypeConverters(Converters.class)进行转换。例如。

代码语言:javascript
运行
复制
@Database(version = 1, entities = {Entity.class})
@TypeConverters(Converters.class)
public abstract class MoviesDatabase extends RoomDatabase {
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45477889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档