По какой-то причине у меня возникают проблемы с преобразователем типов в Android Studios. Я пробовал различные решения из других сообщений, но продолжаю получать эту ошибку. Когда я попробовал Arraylist строк вместо ингредиентов, преобразователь типов действительно работал.
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
@Entity(tableName = "Recipes")
public class recipesDB {
@PrimaryKey
@NonNull
@ColumnInfo(name = "recipeID")
private int id;
//Foreign Key to be used from Ingredients
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "url")
private String url;
@ColumnInfo(name = "readyInMinutes")
private int readyInMinutes;
//Issue Here
@ColumnInfo(name = "ingredients")
private ArrayList<ingredient> ingredients;
DataConverter класс:
public class DataConverter{
@TypeConverter
public static ArrayList<ingredient> toIngredient(String s){
if (s == null){
return null;
}
Gson gson = new Gson();
Type listType = new TypeToken<ArrayList<ingredient>>(){}.getType();
ArrayList<ingredient> ingredients = gson.fromJson(s, listType);
return ingredients;
}
@TypeConverter
public static String getIngredients(ArrayList<ingredient> ingredients){
if (ingredients == null){
return null;
}
Gson gson = new Gson();
Type type = new TypeToken<ArrayList<ingredient>>() {}.getType();
String json = gson.toJson(ingredients);
return json;
}
РЕДАКТИРОВАТЬ База данных приложений:
@Database(entities = {recipesDB.class}, version = 1, exportSchema = false)
@TypeConverters({DataConverter.class})
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;
public abstract recipesDAO recipesdao();
//public abstract pantryDAO pantrydao();
public static AppDatabase getInMemoryDatabase(Context context) {
if (INSTANCE == null) {
INSTANCE = Room.inMemoryDatabaseBuilder(context.getApplicationContext(), AppDatabase.class).build();
}
return INSTANCE;
}
public static void destroyInstance(){INSTANCE = null;}
}
@MartinMarconcini Да, я сделал
похоже, что ваш TypeConverter не используется, можете ли вы вставить абстрактный класс Room DB? Также переименуйте ingredient в Ingredient (это упрощает чтение Java / Kotlin; по соглашению типы должны начинаться с UpperCase и следовать за CamelCase) :)
@MartinMarconcini Итак, я думаю, что рефакторинг устранил проблему. На данный момент я не могу полностью протестировать его, но думаю, что это сработало. Благодарю вас!




НОВЫЙ ОТВЕТ Оказывается, переименование ingredient в Ingredient решило проблему (??), так что… возможно, следите за этими именами классов и следуйте соглашению Java ClassNamesStartWithUpperCase.
СТАРЫЙ ОТВЕТ:
Я думаю, вам может понадобиться создать отдельный «объект» для вашего ingredient (как и recipesDB).
Затем ingredient настраивает @ForeignKey обратно на recipesDB.
И, наконец, вы можете добавить POJO, чтобы иметь как recipesDB, так и ArrayList<Ingredient>.
У меня нет образца здесь, но я видел много в Интернете.
Я думаю, проблема в том, что ваш «Конвертер» не знает, как конвертировать «Ингредиент». Хотя он умеет конвертировать List<Ingredient>, но это не одно и то же. ;)
Рефакторинг имени моего класса из ингредиента -> Ингредиент решил проблему. Не могу объяснить почему, но ваше предложение исправить имя моего файла помогло.
Ну тогда может я ошибался! :) Рад слышать, что это сработало. Я обновлю ответ для будущих читателей.
Можете ли вы отметить ответ как правильный, @JDoe, пожалуйста?
Таким образом, причина проблемы заключалась в том, что класс ингредиентов дублировался за пределами моей текущей папки. Изменив ингредиент класса на Ингредиент, это должно было устранить путаницу с Комнатой.
Вы добавляли его в свою БД с соответствующей аннотацией
@TypeConverters({YourDataConverter.class})?