TypeConverters не работает - PullRequest
0 голосов
/ 08 мая 2018

У меня проблема с конвертером типов. Я добавил аннотацию TypeConverters к своему полю, но у меня все еще есть ошибка, которая не может понять, как сохранить это поле в базе данных. Вы можете рассмотреть возможность добавления конвертера типов для него. Я не знаю почему.

Мой класс сущности

@Getter
@Setter
@Entity(tableName = "drinking")
public class Drinking {

    @PrimaryKey(autoGenerate = true)
    private int id;

    String date;
    int duration;

    @TypeConverters(DrinkingTypeConverter.class)
    List<AlcoholPageDTO> alcoholList = new ArrayList<>();


    public Drinking(String date, int duration, List<AlcoholPageDTO> alcoholList) {

        this.duration = duration;
        this.date = date;
        this.alcoholList.addAll(alcoholList);
    }
}

AlcoholPageDTO класс

@AllArgsConstructor
@Getter
public class AlcoholPageDTO {

    private Alcohol alcohol;
    private int shots;
    private float alcoholAmount;
    List<Long> shootsTime;
}

Преобразователь

public class DrinkingTypeConverter {

    private static Gson gson = new Gson();

    @TypeConverter
    public static List<Drinking> stringToDrinkingList(String data) {
        if (data == null) {
            return Collections.emptyList();
        }

        Type listType = new TypeToken<List<Drinking>>() {}.getType();

        return gson.fromJson(data, listType);
    }

    @TypeConverter
    public static String drinkingListToString(List<Drinking> someObjects) {
        return gson.toJson(someObjects);
    }
}

База данных класса

@Database(entities = {Alcohol.class, Drinking.class}, version = 2)
@TypeConverters({DrinkingTypeConverter.class})
public abstract class ShotCounterDatabase extends RoomDatabase {

    public abstract AlcoholDao alcoholDao();
    public abstract DrinkingDao drinkingDao();

    private static ShotCounterDatabase INSTANCE;

    public static ShotCounterDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (ShotCounterDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            ShotCounterDatabase.class, "Shot_Counter_Database")
                            .fallbackToDestructiveMigration()
                            .build();
                }
            }
        }
        return INSTANCE;
    }
}

1 Ответ

0 голосов
/ 08 мая 2018

Поместите yr @TypeConverters поверх имени вашего класса.

Это потому, что ваш конвертер типов нацелен на список класса Drinking, а не на список AlcoholPageDTO.

Расположение @TypeConverters определяет, какая часть класса получит функциональность. Например, Если оно выше имени метода, только этот метод будет преобразован в другой тип соответственно.

В вашем случае вы должны сделать TypeConverter от List<AlcoholPageDTO> до String и наоборот. Тогда это должно решить проблему.

...