GeoPoint 不允许存储在 Room 中
GeoPoint does not allowed to be stored in Room
已编辑:按照 Nazariy Moshenskiy 的回答建议进行测试
我尝试存储 GeoPoints object in android's abstraction data persistence layer Room。似乎不允许执行此操作。
项目未编译并出现以下错误:
error: Cannot figure out how to save this field into database. You can
consider adding a type converter for it.
有什么解决方案可以实现吗? (兼容类型转换器)
PS:我不想将我的模型 class' 对象类型更改为 long、long 或任何其他类型,因为我在我的模型 class 中使用 GeoPoints 来存储在 Firestore 中,并根据我们可以提供给针对 GeoPoints 的查询的参数进行检索。
由于 OP 解决方案不起作用,我决定实现一个 TypeConverter 来实现这一点。尽管这个问题有很多反对票,认为这无法立即实现,但我将与实际尝试但未能实现这一目标的人分享我的解决方案。
所以我写了一个 class 叫做 CustomTypeConverters 并用 @TypeConverter 注释了两个方法。
- stringToGeoPoint(字符串数据)
This method will take a JSON String as the input parameter. Then it
will create a GeoPoint object using Gson library with the
representation of GeoPoint.class and return it.
- geoPointToString(GeoPoint geoPoint)
This method will take a GeoPoint object as the input parameter. Then
it will create a JSON String object using Gson library and return it.
CustomTypeConverters.java
public class CustomTypeConverters {
@TypeConverter
public static GeoPoint stringToGeoPoint(String data) {
return new Gson().fromJson(data, GeoPoint.class);
}
@TypeConverter
public static String geoPointToString(GeoPoint geoPoint) {
return new Gson().toJson(geoPoint);
}
}
然后我们需要使用我们在 POJO 中定义的 GeoPoint 对象中的注释来指向这个转换器。假设我有一个用户 class 和一个 GeoPoint 对象,
@TypeConverters(CustomTypeConverters.class)
private GeoPoint geoPoint;
我通过浏览验证了答案,data/data/your-application-package/databases在设备中我是运行这个代码。
@channae 说的是真的,但少了一些东西:
您还需要像这样在 db 文件中添加转换器:
@Database(entities = [Wine::class,Store::class], version = 3)
@TypeConverters(GeoPointConverter::class)
abstract class WineryDatabase : RoomDatabase(){
....
}
已编辑:按照 Nazariy Moshenskiy 的回答建议进行测试
我尝试存储 GeoPoints object in android's abstraction data persistence layer Room。似乎不允许执行此操作。
项目未编译并出现以下错误:
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
有什么解决方案可以实现吗? (兼容类型转换器)
PS:我不想将我的模型 class' 对象类型更改为 long、long 或任何其他类型,因为我在我的模型 class 中使用 GeoPoints 来存储在 Firestore 中,并根据我们可以提供给针对 GeoPoints 的查询的参数进行检索。
由于 OP 解决方案不起作用,我决定实现一个 TypeConverter 来实现这一点。尽管这个问题有很多反对票,认为这无法立即实现,但我将与实际尝试但未能实现这一目标的人分享我的解决方案。
所以我写了一个 class 叫做 CustomTypeConverters 并用 @TypeConverter 注释了两个方法。
- stringToGeoPoint(字符串数据)
This method will take a JSON String as the input parameter. Then it will create a GeoPoint object using Gson library with the representation of GeoPoint.class and return it.
- geoPointToString(GeoPoint geoPoint)
This method will take a GeoPoint object as the input parameter. Then it will create a JSON String object using Gson library and return it.
CustomTypeConverters.java
public class CustomTypeConverters {
@TypeConverter
public static GeoPoint stringToGeoPoint(String data) {
return new Gson().fromJson(data, GeoPoint.class);
}
@TypeConverter
public static String geoPointToString(GeoPoint geoPoint) {
return new Gson().toJson(geoPoint);
}
}
然后我们需要使用我们在 POJO 中定义的 GeoPoint 对象中的注释来指向这个转换器。假设我有一个用户 class 和一个 GeoPoint 对象,
@TypeConverters(CustomTypeConverters.class)
private GeoPoint geoPoint;
我通过浏览验证了答案,data/data/your-application-package/databases在设备中我是运行这个代码。
@channae 说的是真的,但少了一些东西: 您还需要像这样在 db 文件中添加转换器:
@Database(entities = [Wine::class,Store::class], version = 3)
@TypeConverters(GeoPointConverter::class)
abstract class WineryDatabase : RoomDatabase(){
....
}