GeoPoint不允许存储在会议室中

时间:2018-09-24 12:58:13

标签: android location google-cloud-firestore android-room geopoints

编辑:根据Nazariy Moshenskiy的答案进行测试

我尝试将GeoPoints对象存储在android的抽象数据持久层Room中。似乎不允许执行此操作。

项目无法编译,并出现以下错误:

  

错误:无法弄清楚如何将该字段保存到数据库中。您可以   考虑为其添加类型转换器。

是否有解决方案来实现这一目标? (兼容的TypeConverter)

PS:我不想将模型类的对象类型更改为long,long或任何其他类型,因为我正在模型类中使用GeoPoints存储在Firestore中,并根据我们可以提供给查询的参数进行检索GeoPoints。

3 个答案:

答案 0 :(得分:3)

由于OP解决方案不起作用,我决定实现TypeConverter来实现这一目标。即使这个问题有很多反对意见,认为可以实现此目标,但我还是会为那些实际尝试或未能实现目标的人分享我的解决方案。

因此,我编写了一个名为CustomTypeConverters的类,并使用@TypeConverter注释了两个方法。

  1. stringToGeoPoint(字符串数据)
  

此方法将采用JSON字符串作为输入参数。然后呢   将使用Gson库创建一个GeoPoint对象,   并返回它。

  1. geoPointToString(GeoPoint geoPoint)
  

此方法将把GeoPoint对象作为输入参数。然后   它将使用Gson库创建一个JSON String对象并返回它。

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对象内的注释来指向此转换器。假设我有一个带有GeoPoint对象的User类,

@TypeConverters(CustomTypeConverters.class)
private GeoPoint geoPoint;

我通过运行此代码的设备中的数据/数据/应用程序包/数据库浏览来验证答案。

答案 1 :(得分:0)

@channae说的是真的,但是有一些遗漏: 您还需要像下面这样在db文件中添加转换器:

@Database(entities = [Wine::class,Store::class], version = 3)
@TypeConverters(GeoPointConverter::class)
abstract class WineryDatabase : RoomDatabase(){
 ....
}

答案 2 :(得分:-1)

任何对象都可以存储在Room中。