GeoPoint 不允许存储在 Room 中

Posted

技术标签:

【中文标题】GeoPoint 不允许存储在 Room 中【英文标题】:GeoPoint does not allowed to be stored in Room 【发布时间】:2019-02-28 00:09:36 【问题描述】:

已编辑:按照 Nazariy Moshenskiy 的回答建议进行测试

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

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

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

是否有任何解决方案可以实现这一目标? (兼容 TypeConverter)

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

【问题讨论】:

我的朋友,你应该先试试再问..... 经过测试,没有运气:( 【参考方案1】:

由于 OPs 解决方案不起作用,我决定实现一个 TypeConverter 来实现这一点。尽管这个问题有很多反对意见认为这不能开箱即用,但我会分享我的解决方案给那些真正尝试过但未能实现的人。

于是我写了一个名为CustomTypeConverters的类,并用@TypeConverter注解了两个方法。

    stringToGeoPoint(字符串数据)

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

    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;

我通过在运行此代码的设备中浏览 data/data/your-application-package/databases 验证了答案。

【讨论】:

【参考方案2】:

@channae 说的是真的,但缺少一些东西: 您还需要像这样在 db 文件中添加转换器:

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

【讨论】:

以上是关于GeoPoint 不允许存储在 Room 中的主要内容,如果未能解决你的问题,请参考以下文章

解析云代码 GeoPoint

不允许:no-auth-role/CognitoIdentityCredentials 无权执行:geo:ListGeofences on resource:xxxxx

使用在 Firestore 中插入的 GeoPoint 在 Google 地图中移动标记

初始化 Plotly 的 Scattergeo fig 的不同方法,一种不允许我“update_geos”,另一种我无法添加数据

从 Parse 中查询 GeoPoint 并将其作为 MKAnnotation 添加到 MapKit?

来自 Room 的小部件中的 setImageViewUri