房型转换器
Room TypeConverter
我不确定 Room 有什么大惊小怪的,因为我觉得它很糟糕。几乎没有任何东西按预期工作。对于我的问题,我想测试他们拥有的类型转换器(到目前为止很失望)。为了测试它,我根据我在网上看到的一个例子做了一个简单的 class。我敢肯定这是愚蠢的事情,甚至与代码无关,但无论如何我都会在这里尝试一下。到目前为止我有:
@Entity
public class User {
@PrimaryKey
private int id;
private String name;
@TypeConverters(Converters.class)
List<String> pets = new ArrayList<>();
public User() { }
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getPets() {
return pets;
}
public void setPets(List<String> pets) {
this.pets = pets;
}
}
然后转换器:
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;
}
}
一个简单的道:
@Dao
public interface UserDao {
@Insert(onConflict = REPLACE)
void insertUser(User user);
@Query("SELECT * FROM User")
List<User> getUsers();
}
最后是数据库:
@Database(entities = { User.class,}, version = 1, exportSchema = false)
@TypeConverters({Converters.class})
public abstract class RoomDb extends RoomDatabase {
public abstract UserDao userDao();
}
而且我还是 "Cannot figure out how to save this field into database. You can consider adding a type converter for it" 狗屎。没有详细说明为什么转换器不工作或曾经发生过什么。为了省去麻烦,我已经尝试在它自己的字段上使用 @Converters,就像替代解决方案建议的那样。
到目前为止,Room 对于复杂的问题让我很失望,而且当您的模型相当复杂时,我发现 Realm 和 ObjectBox 更加一致。
随时加入您的洞察力斗争。
而不是转换器中的 ArrayList class。尝试列表。您的实体正在使用 List 作为其声明的 class。这可能有问题。
这就是上面 Knossos 建议的解决方案。我最终使用 ArrayList 对其进行了测试并开始工作。
class Convertes {
@TypeConverter
fun fromSource(source: Source) :String{
return source.name
}
@TypeConverter
fun tvSource(name: String): Source {
return Source( name,name)
}
}
我不确定 Room 有什么大惊小怪的,因为我觉得它很糟糕。几乎没有任何东西按预期工作。对于我的问题,我想测试他们拥有的类型转换器(到目前为止很失望)。为了测试它,我根据我在网上看到的一个例子做了一个简单的 class。我敢肯定这是愚蠢的事情,甚至与代码无关,但无论如何我都会在这里尝试一下。到目前为止我有:
@Entity
public class User {
@PrimaryKey
private int id;
private String name;
@TypeConverters(Converters.class)
List<String> pets = new ArrayList<>();
public User() { }
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getPets() {
return pets;
}
public void setPets(List<String> pets) {
this.pets = pets;
}
}
然后转换器:
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;
}
}
一个简单的道:
@Dao
public interface UserDao {
@Insert(onConflict = REPLACE)
void insertUser(User user);
@Query("SELECT * FROM User")
List<User> getUsers();
}
最后是数据库:
@Database(entities = { User.class,}, version = 1, exportSchema = false)
@TypeConverters({Converters.class})
public abstract class RoomDb extends RoomDatabase {
public abstract UserDao userDao();
}
而且我还是 "Cannot figure out how to save this field into database. You can consider adding a type converter for it" 狗屎。没有详细说明为什么转换器不工作或曾经发生过什么。为了省去麻烦,我已经尝试在它自己的字段上使用 @Converters,就像替代解决方案建议的那样。
到目前为止,Room 对于复杂的问题让我很失望,而且当您的模型相当复杂时,我发现 Realm 和 ObjectBox 更加一致。
随时加入您的洞察力斗争。
而不是转换器中的 ArrayList class。尝试列表。您的实体正在使用 List 作为其声明的 class。这可能有问题。
这就是上面 Knossos 建议的解决方案。我最终使用 ArrayList 对其进行了测试并开始工作。
class Convertes {
@TypeConverter
fun fromSource(source: Source) :String{
return source.name
}
@TypeConverter
fun tvSource(name: String): Source {
return Source( name,name)
}
}