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

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

@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和一个房间实体之间的incosis

W想有这样的东西

  public class UserNameAndAllPets { @JsonProperty("id") public int id; @JsonProperty("name") public String name; @Relation(parentColumn = "id") @JsonProperty("pets") public List<String> pets; } 

因为我收到以下Json:

 { "id" : "1", "name" : "someName", "pets": ["cat", "dog", "camel"] } 

任何人都知道解决方案?

编辑:

现在我的示例代码看起来像但是我有错误: 错误:参数的类型必须是@Entity或它的集合/数组注解的类。

 @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或其集合/数组注解的类。

 @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 } 

解决方案

如果你正在使用Kotlin,你应该使用ArrayList

 @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertNewItems(itemList: ArrayList<Item>) 

我有同样的问题,我用@TypedConverter解决。 我在数据库中保存列表为JSONArray.toString

 @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)进行此类转换的类。 例如

 @Database(version = 1, entities = {Entity.class}) @TypeConverters(Converters.class) public abstract class MoviesDatabase extends RoomDatabase {