Проблемы с конвертером типов комнат Android Studio

По какой-то причине у меня возникают проблемы с преобразователем типов в 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;}
}

Вы добавляли его в свою БД с соответствующей аннотацией @TypeConverters({YourDataConverter.class})?

Martin Marconcini 09.04.2018 19:34

@MartinMarconcini Да, я сделал

random coder dude 09.04.2018 20:21

похоже, что ваш TypeConverter не используется, можете ли вы вставить абстрактный класс Room DB? Также переименуйте ingredient в Ingredient (это упрощает чтение Java / Kotlin; по соглашению типы должны начинаться с UpperCase и следовать за CamelCase) :)

Martin Marconcini 09.04.2018 20:27

@MartinMarconcini Итак, я думаю, что рефакторинг устранил проблему. На данный момент я не могу полностью протестировать его, но думаю, что это сработало. Благодарю вас!

random coder dude 09.04.2018 20:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
427
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

НОВЫЙ ОТВЕТ Оказывается, переименование ingredient в Ingredient решило проблему (??), так что… возможно, следите за этими именами классов и следуйте соглашению Java ClassNamesStartWithUpperCase.

СТАРЫЙ ОТВЕТ:

Я думаю, вам может понадобиться создать отдельный «объект» для вашего ingredient (как и recipesDB).

Затем ingredient настраивает @ForeignKey обратно на recipesDB.

И, наконец, вы можете добавить POJO, чтобы иметь как recipesDB, так и ArrayList<Ingredient>.

У меня нет образца здесь, но я видел много в Интернете.

Я думаю, проблема в том, что ваш «Конвертер» не знает, как конвертировать «Ингредиент». Хотя он умеет конвертировать List<Ingredient>, но это не одно и то же. ;)

Рефакторинг имени моего класса из ингредиента -> Ингредиент решил проблему. Не могу объяснить почему, но ваше предложение исправить имя моего файла помогло.

random coder dude 10.04.2018 02:09

Ну тогда может я ошибался! :) Рад слышать, что это сработало. Я обновлю ответ для будущих читателей.

Martin Marconcini 10.04.2018 19:39

Можете ли вы отметить ответ как правильный, @JDoe, пожалуйста?

MiguelHincapieC 09.05.2018 15:47

Таким образом, причина проблемы заключалась в том, что класс ингредиентов дублировался за пределами моей текущей папки. Изменив ингредиент класса на Ингредиент, это должно было устранить путаницу с Комнатой.

Другие вопросы по теме