방금 오프라인 데이터 저장을 위해 Room을 구현했습니다. 하지만 Entity 클래스에서 다음 오류가 발생합니다.
Error:(27, 30) error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
그리고 수업은 다음과 같습니다.
@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;
}
}
그래서 기본적으로 ArrayList를 데이터베이스에 저장하고 싶지만 관련된 것을 찾을 수 없었습니다. Room을 사용하여 어레이를 저장하는 방법에 대해 안내해 주시겠습니까?
참고 : MyListItems Pojo 클래스에는 2 개의 문자열이 포함되어 있습니다 (현재).
미리 감사드립니다.
답변
옵션 # 1 : 유무는 MyListItems
될 @Entity
대로 MainActivityData
입니다. 다시 MyListItems
설정합니다 . 하지만이 경우에는 Room에서와 같이를 가질 수 없습니다 . 엔티티는 다른 엔티티를 참조하지 않습니다. 그러나 뷰 모델 또는 유사한 POJO 구성은 및 관련를 가질 수 있습니다 .@ForeignKey
MainActivityData
MainActivityData
private ArrayList<MyListItems> myListItems
MainActivityData
ArrayList<MyListItems>
옵션 # 2 : 몇 가지 기본 유형 (예 : 스토리지 형식으로 JSON을 사용 하는 것과 같은) 과 @TypeConverter
변환 ArrayList<MyListItems>
할 메서드 쌍을 설정합니다 String
. 이제 직접 MainActivityData
가질 수 ArrayList<MyListItems>
있습니다. 그러나에 대한 별도의 테이블이 없으므로 MyListItems
잘 쿼리 할 수 없습니다 MyListItems
.
답변
유형 변환기 는이를 위해 특별히 제작되었습니다. 귀하의 경우 아래의 코드 스 니펫을 사용하여 데이터를 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;
}
}
이 클래스를 방 DB에 이렇게 언급하세요
@Database (entities = {MainActivityData.class},version = 1)
@TypeConverters({Converters.class})
여기에 더 많은 정보
답변
유형 변환기 용 Kotlin 버전 :
class Converters {
@TypeConverter
fun listToJson(value: List<JobWorkHistory>?) = Gson().toJson(value)
@TypeConverter
fun jsonToList(value: String) = Gson().fromJson(value, Array<JobWorkHistory>::class.java).toList()
}
나는 JobWorkHistory
내 목적을 위해 물건을 사용했다, 자신의 물건을 사용하라
@Database(entities = arrayOf(JobDetailFile::class, JobResponse::class), version = 1)
@TypeConverters(Converters::class)
abstract class MyRoomDataBase : RoomDatabase() {
abstract fun attachmentsDao(): AttachmentsDao
}
답변
더 나은 버전의 List<String>
변환기
class StringListConverter {
@TypeConverter
fun fromString(stringListString: String): List<String> {
return stringListString.split(",").map { it }
}
@TypeConverter
fun toString(stringList: List<String>): String {
return stringList.joinToString(separator = ",")
}
}
답변
이것이 내가 목록 변환을 처리하는 방법입니다.
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;
}}
그런 다음 데이터베이스에서 아래와 같이 수행합니다.
@Database(entities = {MovieEntry.class}, version = 1)
@TypeConverters(GenreConverter.class)
그리고 아래는 동일한 kotlin 구현입니다.
class GenreConverter {
@TypeConverter
fun gettingListFromString(genreIds: String): List<Int> {
val list = mutableListOf<Int>()
val array = genreIds.split(",".toRegex()).dropLastWhile {
it.isEmpty()
}.toTypedArray()
for (s in array) {
if (s.isNotEmpty()) {
list.add(s.toInt())
}
}
return list
}
@TypeConverter
fun writingStringFromList(list: List<Int>): String {
var genreIds=""
for (i in list) genreIds += ",$i"
return genreIds
}}
답변
위에서 설명한 것과 동일한 오류 메시지가 나타납니다. 추가하고 싶습니다. @Query에이 오류 메시지가 표시되면 @Query 주석 위에 @TypeConverters를 추가해야합니다.
예:
@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();
}
}
답변
이 답변은 Kotin을 사용하여 쉼표로 분할하고 쉼표로 구분 된 문자열을 구성합니다. 쉼표는 마지막 요소를 제외한 모든 요소의 끝에 있어야하므로 단일 요소 목록도 처리합니다.
object StringListConverter {
@TypeConverter
@JvmStatic
fun toList(strings: String): List<String> {
val list = mutableListOf<String>()
val array = strings.split(",")
for (s in array) {
list.add(s)
}
return list
}
@TypeConverter
@JvmStatic
fun toString(strings: List<String>): String {
var result = ""
strings.forEachIndexed { index, element ->
result += element
if(index != (strings.size-1)){
result += ","
}
}
return result
}
}