Android机房持久性库-TypeConverter错误错误:无法弄清楚如何将字段保存到数据库 [英] Android room persistent library - TypeConverter error of error: Cannot figure out how to save field to database"
问题描述
由于错误,我无法在房间中创建typeConverter.我似乎正在按照文档进行所有操作.我想将列表转换为json字符串.让我们来看看我的实体:
Im not able to create a typeConverter in room due to an error. I seem to be following everything per the docs. I would like to convert a list to a json string. lets take a look at my entity:
@Entity(tableName = TABLE_NAME)
public class CountryModel {
public static final String TABLE_NAME = "Countries";
@PrimaryKey
private int idCountry;
/* I WANT TO CONVERT THIS LIST TO A JSON STRING */
private List<CountryLang> countryLang = null;
public int getIdCountry() {
return idCountry;
}
public void setIdCountry(int idCountry) {
this.idCountry = idCountry;
}
public String getIsoCode() {
return isoCode;
}
public void setIsoCode(String isoCode) {
this.isoCode = isoCode;
}
public List<CountryLang> getCountryLang() {
return countryLang;
}
public void setCountryLang(List<CountryLang> countryLang) {
this.countryLang = countryLang;
}
}
country_lang 是我想要转换为字符串json的内容.所以我创建了以下转换器: Converters.java:
The country_lang is what i would like to convert to a string json. So i created the following converter: Converters.java:
public class Converters {
@TypeConverter
public static String countryLangToJson(List<CountryLang> list) {
if(list == null)
return null;
CountryLang lang = list.get(0);
return list.isEmpty() ? null : new Gson().toJson(lang);
}}
然后问题出在我放置@TypeConverters({Converters.class})的任何地方,我一直收到错误消息.但是正式地,这是我放置注释以注册typeConverter的地方:
then the problem is anywhere i put the @TypeConverters({Converters.class}) i keep getting an error. But officially this is where i have placed the annotation to get the typeConverter registered:
@Database(entities = {CountryModel.class}, version = 1 ,exportSchema = false)
@TypeConverters({Converters.class})
public abstract class MYDatabase extends RoomDatabase {
public abstract CountriesDao countriesDao();
}
我得到的错误是:
Error:(58, 31) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
推荐答案
自Room宣布以来,这是我常见的问题. Room不支持直接存储列表的功能,也不支持转换到列表或从列表转换的功能.它支持转换和存储POJO.
This is a common problem I've seen since Room was announced. Room does not support the ability to store Lists directly, nor the ability to convert to/from Lists. It supports converting and storing POJO's.
在这种情况下,解决方案很简单.而不是存储List<CountryLang>
,而是要存储CountryLangs
(请注意's')
In this case the solution is simple. Instead of storing a List<CountryLang>
you want to store CountryLangs
(note the 's')
我在这里做了一个简单的解决方案示例:
I've done a quick example of a solution here :
public class CountryLangs {
private List<String> countryLangs;
public CountryLangs(List<String> countryLangs) {
this.countryLangs = countryLangs;
}
public List<String> getCountryLangs() {
return countryLangs;
}
public void setCountryLangs(List<String> countryLangs) {
this.countryLangs = countryLangs;
}
}
此POJO是您先前对象的反转.它是存储语言列表的对象.而不是存储您的语言的对象列表.
This POJO is an inversion of your previous object. It is an object that stores a list of languages. Instead of a list of objects that store your language.
public class LanguageConverter {
@TypeConverter
public CountryLangs storedStringToLanguages(String value) {
List<String> langs = Arrays.asList(value.split("\\s*,\\s*"));
return new CountryLangs(langs);
}
@TypeConverter
public String languagesToStoredString(CountryLangs cl) {
String value = "";
for (String lang :cl.getCountryLangs())
value += lang + ",";
return value;
}
}
此转换器获取字符串列表,并将其转换为逗号分隔的字符串,以存储在单列中.当它从SQLite数据库中获取字符串以进行转换时,它会以逗号分隔列表,并填充CountryLangs.
This converter takes a list of strings and converts them into a comma seperated string to be stored in a single column. When it fetches the string from the SQLite db to convert back, it splits the list on commas, and populates the CountryLangs.
确保在进行这些更改后更新RoomDatabase版本.其余配置正确.余下的房间持久性工作将使您快乐地狩猎.
Insure to update your RoomDatabase version after making these changes.You have the rest of the configuration correct. Happy hunting with the rest of your Room persistence work.
这篇关于Android机房持久性库-TypeConverter错误错误:无法弄清楚如何将字段保存到数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!