我的问题是如何存储
List<Enum>
RoomDatabase中的, 到目前为止,我找不到答案。
答案 0 :(得分:3)
枚举:
public enum HelloEnum {
A,
B,
C
}
转换器:
public class EnumConverter {
@TypeConverter
public List<HelloEnum> storedStringToEnum(String value) {
List<String> dbValues = Arrays.asList(value.split("\\s*,\\s*"));
List<HelloEnum> enums = new ArrayList<>();
for (String s: dbValues)
enums.add(HelloEnum.valueOf(s));
return enums;
}
@TypeConverter
public String languagesToStoredString(List<HelloEnum> cl) {
String value = "";
for (HelloEnum lang : cl)
value += lang.name() + ",";
return value;
}
}
在插入和获取数据方面,这不会引起问题。
@Dao
public interface HelloPojoDao {
@Query("SELECT * FROM helloPojo")
List<HelloPojo> fetchAll();
@Insert
void insertPojo(HelloPojo pojo);
}
然而,我会指出,通过enum过滤现在变得有点棘手。例如,如果要编写查询以获取包含enum.A和enum.B的对象,则必须构建一个查询字符串对象的查询。在这种情况下,“SELECT * FROM pojo WHERE enums包含'A,'和'B,'。因此,最好为您的枚举分配数值(如@Kuffs回答详细信息),因为解析整数可能会产生的问题少于解析字符串。
希望这可以解决您的问题。随意在评论部分提出任何问题,并快乐狩猎!
答案 1 :(得分:3)
使用name
时,使用Kotlin更简单
class EnumTypeConverter {
@TypeConverter
fun restoreEnum(enumName: String): EnumType = EnumType.valueOf(enumName)
@TypeConverter
fun saveEnumToString(enumType: EnumType) = enumType.name
}
答案 2 :(得分:0)
答案 3 :(得分:0)
让我展示一下使用kotlin保留/检索它的方法。
手术期间我们有哪些限制?
toString
字符串列表方法,因为它可能取决于我们确切使用的环境因此,我认为正确的实现应如下所示:
Enumerable
接口因此,可枚举接口:
/** marks the enum with custom int code for each value */
interface Enumerable {
val code: Int
}
枚举示例:
enum class PaymentSystemEntity constructor(
override val code: Int
) : Enumerable {
VISA(1),
MASTERCARD(2),
UNKNOWN(0);
companion object {
fun parseFromCode(code: Int): PaymentSystemEntity = values()
.firstOrNull { it.code == code } ?: UNKNOWN
}
}
序列化扩展:
fun <T> List<T>.asString(): String where T : Enum<T>, T : Enumerable = this
.map { it.code }
.joinToString(separator = ",")
fun <T> String.toEnumList(creator: (code: Int) -> T): List<T> where T : Enum<T>, T : Enumerable = this
.split(',')
.map { it.toInt() }
.map { creator(it) }
枚举的样本类型转换器:
class PaymentSystemTypeConverter {
@TypeConverter
fun paymentSystemsToString(value: List<@JvmSuppressWildcards PaymentSystemEntity>): String =
value.asString()
@TypeConverter
fun stringToPaymentSystems(value: String): List<@JvmSuppressWildcards PaymentSystemEntity> =
value.toEnumList { PaymentSystemEntity.parseFromCode(it) }
}
您可能以相同的方式实现了其他类型的集合
答案 4 :(得分:0)
科特林的杰克·道尔顿(Jack Dalton)版本:
@TypeConverter
fun storedStringListLineType(value: String): List<LineType> {
val dbValues = value.split("\\s*,\\s*".toRegex()).dropLastWhile { it.isEmpty() }
val enums: MutableList<LineType> = ArrayList()
for (s in dbValues)
enums.add(LineType.valueOf(s))
return enums
}
@TypeConverter
fun listLineTypeToStoredString(listLineTypes: List<LineType>): String {
var value = ""
for (lineType in listLineTypes)
value += lineType.name + ","
return value
}