Search code examples
androiddatabaseandroid-sqliteandroid-roomcustom-object

Array of custom objects in Room Database


I'm trying to create a Room database for my Android app and I have run into a problem with array of custom object.

Error message:

java.lang.IllegalArgumentException: cz.polreich.banks.model.airBank.OpeningHoursDay[]cannot be converted to an Element

This is the object which has the problematic array embedded:

@Entity
public class OpeningHours  {

@PrimaryKey(autoGenerate = true)
private int ohId;
private boolean isNonstop;
@Embedded
private OpeningHoursDay[] days;

public OpeningHours() {
}

// getters and setters

And this is my database definition:

@Database(version = 1, entities = {OpeningHours.class, OpeningHoursDay.class})
abstract class AppDatabase extends RoomDatabase {
@TypeConverters({Converters.class})

abstract public BranchDao branchDao();
}

And I also have type converter which I hoped, should solve this problem by converting the array to the List and back, but it didn't help:

public class Converters {
@TypeConverter
public List<OpeningHoursDay> fromOpeningHoursDayArray(OpeningHoursDay[] ohda){
    List<OpeningHoursDay> ohdList = new ArrayList<>();
    ohdList.addAll(Arrays.asList(ohda));
    return ohdList;
}

@TypeConverter
public OpeningHoursDay[] toOpeningHoursDayArray(List<OpeningHoursDay> ohdList){
    OpeningHoursDay[] ohda = null;
    for (int i = 0; i < ohdList.size(); i++) {
        ohda[i] = ohdList.get(i);
    }
    return ohda;
}
}

Edit: I have tried to change the TypeConverter to convert objects to json, but it didn't help:

public class Converters {

Gson gson = new Gson();

@TypeConverter
public String fromOpeningHoursDayArray(OpeningHoursDay[] ohda){
    ArrayList<OpeningHoursDay> ohdList = new ArrayList<>();
    ohdList.addAll(Arrays.asList(ohda));
    return gson.toJson(ohdList);
}

@TypeConverter
public OpeningHoursDay[] toOpeningHoursDayArray(String ohdJson){
    ArrayList<OpeningHoursDay> ohdList = new ArrayList<>();
    ohdList = gson.fromJson(ohdJson, new TypeToken<ArrayList<OpeningHoursDay>>(){}.getType());
    OpeningHoursDay[] ohda = null;
    for (int i = 0; i < ohdList.size(); i++) {
        ohda[i] = ohdList.get(i);
    }
    return ohda;
}

}

Does anyone have any idea how to solve this?


Solution

  • Removing @Embedded annotation for the custom object array fixed the issue.