room java android android-room

java - room insert list



Android Room Database: ¿Cómo manejar Arraylist en una entidad? (5)

Así es como manejo la conversión de lista

public class GenreConverter { @TypeConverter public List<Integer> gettingListFromString(String genreIds) { List<Integer> list = new ArrayList<>(); String[] array = genreIds.split(","); for (String s : array) { if (!s.isEmpty()) { list.add(Integer.parseInt(s)); } } return list; } @TypeConverter public String writingStringFromList(List<Integer> list) { String genreIds = ""; for (int i : list) { genreIds += "," + i; } return genreIds; }}

Y luego en la base de datos hago lo que se muestra a continuación

@Database(entities = {MovieEntry.class}, version = 1) @TypeConverters(GenreConverter.class)

Acabo de implementar Room para guardar datos sin conexión. Pero en una clase de Entidad, obtengo el siguiente error:

Error:(27, 30) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.

Y la clase es la siguiente:

@Entity(tableName = "firstPageData") public class MainActivityData { @PrimaryKey private String userId; @ColumnInfo(name = "item1_id") private String itemOneId; @ColumnInfo(name = "item2_id") private String itemTwoId; // THIS IS CAUSING THE ERROR... BASICALLY IT ISN''T READING ARRAYS @ColumnInfo(name = "mylist_array") private ArrayList<MyListItems> myListItems; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public ArrayList<MyListItems> getMyListItems() { return myListItems; } public void setCheckListItems(ArrayList<MyListItems> myListItems) { this.myListItems = myListItems; } }

Básicamente, quiero guardar el ArrayList en la base de datos, pero no pude encontrar nada relevante para él. ¿Me puede orientar sobre cómo guardar una matriz usando Room?

NOTA: la clase MyListItems Pojo contiene 2 cadenas (a partir de ahora)

Gracias por adelantado.


Opción # 1: hacer que MyListItems sea ​​una @Entity , como MainActivityData es. MyListItems configuraría una @ForeignKey nuevo en MainActivityData . Sin embargo, en este caso, MainActivityData no puede tener MainActivityData private ArrayList<MyListItems> myListItems , como en Room, las entidades no se refieren a otras entidades. Sin embargo, un modelo de vista o construcción similar de POJO podría tener un MainActivityData y su ArrayList<MyListItems> .

Opción # 2: configure un par de métodos @TypeConverter para convertir ArrayList<MyListItems> a y desde algún tipo básico (por ejemplo, una String , como usar JSON como formato de almacenamiento). Ahora, MainActivityData puede tener su ArrayList<MyListItems> directamente. Sin embargo, no habrá una tabla separada para MyListItems , por lo que no puede consultar muy bien en MyListItems .


Tenía el mismo mensaje de error como se describe anteriormente. Me gustaría agregar: si aparece este mensaje de error en @Query, debe agregar @TypeConverters sobre la anotación @Query.

Ejemplo:

@TypeConverters(DateConverter.class) @Query("update myTable set myDate=:myDate where id = :myId") void updateStats(int myId, Date myDate);

....

public class DateConverter { @TypeConverter public static Date toDate(Long timestamp) { return timestamp == null ? null : new Date(timestamp); } @TypeConverter public static Long toTimestamp(Date date) { return date == null ? null : date.getTime(); } }


Versión de Kotlin para convertidor de tipo:

class Converters { @TypeConverter fun listToJson(value: List<JobWorkHistory>?): String { return Gson().toJson(value) } @TypeConverter fun jsonToList(value: String): List<JobWorkHistory>? { val objects = Gson().fromJson(value, Array<JobWorkHistory>::class.java) as Array<JobWorkHistory> val list = objects.toList() return list } }

JobWorkHistory objeto JobWorkHistory para mi propósito, use el objeto de su propio

@Database(entities = [JobDetailFile::class, JobResponse::class], version = 1) @TypeConverters(Converters::class) abstract class MyRoomDataBase : RoomDatabase() { abstract fun attachmentsDao(): AttachmentsDao }


Tipo convertidor se hacen específicamente para eso. En su caso, puede utilizar el fragmento de código que se proporciona a continuación para almacenar datos en DB.

public class Converters { @TypeConverter public static ArrayList<String> fromString(String value) { Type listType = new TypeToken<ArrayList<String>>() {}.getType(); return new Gson().fromJson(value, listType); } @TypeConverter public static String fromArrayList(ArrayList<String> list) { Gson gson = new Gson(); String json = gson.toJson(list); return json; } }

Y menciona esta clase en tu habitación DB así.

@Database (entities = {MainActivityData.class},version = 1) @TypeConverters({Converters.class})

Más información here