сохранить ArrayList как строку внутри комнаты

#java #arraylist #android-sqlite #android-room

#java #arraylist #android-sqlite #android-room

Вопрос:

Я использую библиотеку Room из jetpack и хочу сохранить свой ArrayList внутри базы данных Room.

Я использую TypeConverter для преобразования ArrayList в строку, но все еще получаю ошибку.

 Error Message : Cannot figure out how to save this field into database. You can consider adding a type converter for it.
  

это мой преобразователь типов.

 public class TypeConverterUtils {
    @TypeConverter
    public static String fromArray(ArrayList<CropData> arrayList) {
        return GsonUtils.toGson(arrayList);
    }
}
  

это мой класс базы данных.

 @TypeConverters({TypeConverterUtils.class})
public abstract class CheruvuDatabase extends RoomDatabase {

    private static final String DATABASE_NAME = "Cheruvu.db";

    public abstract OtpDAO otpDAO();

    public abstract FarmerInfoDAO farmerInfoDAO();

    // For Singleton instantiation
    private static final Object LOCK = new Object();
    private static volatile CheruvuDatabase sInstance;

    public static CheruvuDatabase getInstance(Context context) {
        if (sInstance == null) {
            synchronized (LOCK) {
                if (sInstance == null) {
                    context.getApplicationContext().deleteDatabase(CheruvuDatabase.DATABASE_NAME);
                    sInstance = Room.databaseBuilder(context.getApplicationContext(), CheruvuDatabase.class, CheruvuDatabase.DATABASE_NAME)
                            .fallbackToDestructiveMigration()
                            .allowMainThreadQueries()
                            .build();
                }
            }
        }
        return sInstance;
    }
}
  

Я хочу сохранить этот ArrayList.

private ArrayList cropData = новый ArrayList<>();

это мой класс CropData.

 public class CropData {

    private String cropName;
    private Crop crop;
    private Float cropAcres;
    private Float cropYield;
    private Float cropPrice;

    public String getCropName() {
        return cropName;
    }

    public void setCropName(String cropName) {
        this.cropName = cropName;
    }

    public Crop getCrop() {
        return crop;
    }

    public void setCrop(Crop crop) {
        this.crop = crop;
    }

    public Float getCropAcres() {
        return cropAcres;
    }

    public void setCropAcres(Float cropAcres) {
        this.cropAcres = cropAcres;
    }

    public Float getCropYield() {
        return cropYield;
    }

    public void setCropYield(Float cropYield) {
        this.cropYield = cropYield;
    }

    public Float getCropPrice() {
        return cropPrice;
    }

    public void setCropPrice(Float cropPrice) {
        this.cropPrice = cropPrice;
    }
}
  

Комментарии:

1. Если вы получаете сообщение об ошибке, вы должны включить сообщение об ошибке в свой вопрос

2. Добавлен @JoakimDanielson.

Ответ №1:

Добавили ли вы @Embedded в переменную ArrayList? потому что вам нужно будет внедрить класс, который вы хотите преобразовать.

например,

 ArrayList<CropData> cropData;
  

и CropData.class отличается. так что просто добавьте

 @Embedded 
ArrayList<CropData> cropData;
  

и ваша проблема будет решена.