сохранить arrayList <Class>как строку внутри комнаты - PullRequest
0 голосов
/ 06 апреля 2019

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

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

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

это мой typeConverter.

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

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

@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 = new 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 Ответ

1 голос
/ 06 апреля 2019

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

например,

ArrayList<CropData> cropData;

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

@Embedded 
ArrayList<CropData> cropData;

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

...