android - GeoPoint 不允许存储在 Room 中
问题描述
已编辑:按照 Nazariy Moshenskiy 的回答建议进行测试
我尝试将GeoPoints对象存储在 android 的抽象数据持久层Room中。似乎不允许此操作。
项目无法编译并出现以下错误:
错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。
有什么解决方案可以实现这一目标吗?(兼容类型转换器)
PS:我不想将模型类的对象类型更改为 long、long 或任何其他类型,因为我在模型类中使用 GeoPoints 存储在 Firestore 中并根据我们可以提供给针对 GeoPoints 的查询的参数进行检索。
解决方案
由于 OPs 解决方案不起作用,我决定实现一个 TypeConverter 来实现这一点。尽管这个问题有很多反对意见,认为这不能开箱即用,但我会分享我的解决方案给那些真正尝试过但未能实现的人。
所以我写了一个名为CustomTypeConverters的类,并用@TypeConverter注解了两个方法。
- stringToGeoPoint(字符串数据)
此方法将 JSON 字符串作为输入参数。然后它将使用具有 GeoPoint.class 表示的 Gson 库创建一个 GeoPoint 对象并将其返回。
- 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 来验证答案。
推荐阅读
- php - 如何向 entry_options 添加另一个字段值
- tfs - 构建列表中的 Azure DevOps 字段值
- pandas - 我确定“items_tmp_dic2”的类型是dict,为什么要报这个错误?
- javascript - 如何通过javascript从管理页面检索Django模型ID
- tfs - 在 Azure Devops 2019 中导出工作项定义失败
- c# - 如何判断“如果在开发环境中”?
- arrays - 如何在数组中找到总和 3 个元素?
- sqlite - 如何将连接与 Sqlite 索引一起使用
- javascript - 使用 axios/fetch 和 multer 上传文件时服务器响应未定义
- python - 获取小数部分的长度