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 注释了两个方法。

  1. 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.

  1. 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(){
 ....
}