2017-08-03 30 views
-1

嘿谷歌對使用@Relation如何保存嵌套列表<String>在RoomDB在Android

@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和一間實體

W之間incosistence想有soemthing像

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

節能項目時,爲什麼...雖然 錯誤的新問題出現 道不能插入我的實體的名單,沒有理由:該參數的類型必須是一個類註釋與@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 

} 

爲道

SOLUTION

如果你正在使用科特林你應該使用ArrayList

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

回答

4

我有同樣的問題,我與@TypedConverter解決。我將JSONArray.toString保存在db中。

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

對於您的db類,擴展爲RoomDatabase的那個類,您將必須聲明使用@TypeConverters(Converters.class)進行此轉換的類。例如。

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

對於 '@TypeConverters(StringListToGsonConverter.class) 列表 SOMETYPE = NULL;' 我 *錯誤:參數的類型必須與@Entity或收集/它陣列註釋的類。* – murt

+0

您是否可以使用所做的更改來更新代碼? – Blackbelt

+0

我已更新 – murt