房间类型转换器不工作 [英] Room TypeConverter not working
本文介绍了房间类型转换器不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我遇到Room无法识别我的转换器的问题.错误:
I have an issue with Room not recognizing my converter. Error:
Cannot figure out how to save this field into database. You can consider adding a type converter for it.
我需要在数据库中存储一些地图和地图集.我究竟做错了什么?房间不喜欢接口或泛型吗?
代码:(对不起所有字段和类名,它们是英语和捷克语的混合体,与某些Java类的名称不同):
转换器(仅一部分)
I need to store some maps and sets in my database. What am I doing wrong? Does room not like interfaces or generics?
code: (sorry for all the fields and class name, they are a mixture of English and Czech to not have same names as some java classes):
Converter (only part)
public class MyConverter {
/**
* makes a string like 1;2;3;5;4;8;1;6;8;4 from a collection of integers.
*/
@TypeConverter
public static @NonNull String toString(@NonNull Collection<Integer> c) {
StringBuilder sb = new StringBuilder();
for (Integer item : c) {
sb.append(item.toString() + ";");
}
sb.delete(sb.length()-1,sb.length()-1);
return sb.toString();
}
/**
* makes a Set<Integer> from string like 1;2;3;4;5;6
* @throws NumberFormatException on incorrect input
*/
@TypeConverter
public static@NonNull Set<Integer> toIntegerSet(@NonNull String s) {
Set<Integer> set = new LinkedHashSet<>();
String[] split = s.split(";");
try {
for (String item : split) {
set.add(Integer.parseInt(item));
}
}catch (NumberFormatException e){
throw new NumberFormatException("Could not make set of integers (like 1;2;3;8;7) from \"" + s +"\"");
}
return set;
}
}
数据库:
@Database(entities = {SQLUkol.class,SQLPredmet.class,SQLList.class},version = 1)
@TypeConverters({MyConverter.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract MojeDAO mojeDao();
}
其中一个实体(不包括getter,setter和构造函数):
One of the entities (getters, setters and constructors not included):
@Entity(primaryKeys = {"id", "list_id"},
indices = {@Index("list_id")},
foreignKeys = @ForeignKey(entity = SQLList.class, parentColumns = "id",
childColumns = "list_id", onDelete = ForeignKey.CASCADE),
tableName = "ukols")
public class SQLUkol implements Comparable<SQLUkol> {
@ColumnInfo(name = "list_id")
private final int listID;
private final int id;
private String title;
@ColumnInfo(name = "title_changed")
private boolean titleChanged = false;
private String notes;
@ColumnInfo(name = "notes_changed")
private boolean notesChanged = false;
private boolean completed;
@ColumnInfo(name = "completed_changed")
private boolean completedChanged = false;
private LocalDate date;
@ColumnInfo(name = "date_changed")
private boolean dateChanged = false;
@Embedded
private final SQLData data;
}
推荐答案
房间不太喜欢泛型.我必须这样做:
Room does not like generics much. I had to do this:
@TypeConverter
public static String toString1(Map<String, String> m){
...
}
@TypeConverter
public static String toString2(Map<Integer, String> m){
...
}
@TypeConverter
public static String toString3(Set<Integer> s){
...
}
@TypeConverter
public static String toString4(List<Integer> l){
...
}
不仅仅是
@TypeConverter
public static String toString(Map m){
...
}
@TypeConverter
public static String toString(Collection<Integer> c){
...
}
这篇关于房间类型转换器不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文