[java] Android Room Database : 엔티티에서 Arraylist를 처리하는 방법은 무엇입니까?

방금 오프라인 데이터 저장을 위해 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 구성은 및 관련를 가질 수 있습니다 .@ForeignKeyMainActivityDataMainActivityDataprivate ArrayList<MyListItems> myListItemsMainActivityDataArrayList<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
        }
    }