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