【问题标题】:Android Room TypeConverter for DoubleAndroid Room TypeConverter for Double
【发布时间】:2018-01-18 21:34:46
【问题描述】:

我正在尝试为 Android Room Persistance Library 使用自定义 TypeConverter,如 documentation 所示。主要思想是格式化 Android Room Dao 正在执行的所有 Sqlite SUM 选择。

我的代码:

 @TypeConverter
public static double toDouble(String str) {
    return FormatHelper.formatAmount(Double.parseDouble(str));
}

@TypeConverter
public static String fromDouble(double doub) {
    return String.valueOf(FormatHelper.formatAmount(doub));
}

我已经尝试清除数据并重建应用程序。 同一类中的日期转换器正在工作。 Android TypeConverters 不支持 Primitive 变量吗?

编辑:

我在 RoomDatabase 类中注册了 TypeConverter,以便在整个数据库中使用它。

更具体地说是我的问题:如果我的 Dao 类中有这样的查询:

@Query("SELECT SUM(quantity) FROM production_plan_item")
Double getActivePlanItemsCount();

它有时可能会返回类似 2.30000000000001 的值。

我认为类型转换器用于处理查询的返回值。每次我将双精度保存到数据库或从中选择双精度之前,我的 TypeConverter 都会为我舍入双精度,而我每次选择某些东西时都不必舍入它。

否则我必须手动舍入每个选定的双精度数。

【问题讨论】:

  • “主要思想是格式化所有选择 Android Room Dao 正在执行的 Sqlite SUM”——这对我来说毫无意义。格式化不是持久性库的责任。这是演示者或与用户界面相关的一些其他代码的责任。除此之外,您在哪里注册这些 TypeConverter 方法?您希望它们会产生什么影响?
  • @CommonsWare 我编辑了我的问题。

标签: android android-room


【解决方案1】:

我认为类型转换器用于处理查询的返回值

您的@TypeConverter 方法在doubleString 之间转换。 SUM 不会返回 String。您的@Query 方法返回Double。因此,这两种@TypeConverter 方法都不相关,因为没有发生Stringdouble 转换。

否则我必须手动舍入每个选定的双精度。

也许您应该在数据库架构中使用更少的 REAL 列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2018-12-28
    • 2021-05-05
    • 2022-01-16
    • 2021-11-24
    相关资源
    最近更新 更多