【问题标题】:Loading null values into Primitive types将空值加载到原始类型中
【发布时间】:2012-02-13 12:44:58
【问题描述】:

我正在尝试使用 ormlite 查询方法将数据库行加载到 DO 对象中。我面临的问题是数据库中的空值映射到 DO 对象中的 Wrapper 类型字段。空字段作为 0 填充到 DO 中,这弄乱了我的业务逻辑。

有没有办法让 ormlite 将这些字段填充为 null 而不是 0。

我的示例 DO 结构:

@DatabaseTable(tableName="PERSON")
public class Person
{
   @DatabaseField(columnName="NAME", dataType=DataType.STRING, useGetSet=true)
   private String name;

   @DatabaseField(columnName = "AGE", dataType = DataType.SHORT, useGetSet = true)
   private Short age;

   public String getName() 
   {
      return name;
   }

   public void setName(String name) 
   {
      this.name = name;
   }

   public Short getAge() 
   {
     return age;
   }

   public void setAge(Short age) 
   {
     this.age = age;
   }
}

我用来加载对象的 DAO 代码是:

person = queryForEq("NAME", someName).get(0);

总而言之,在 Person 类中,如果人的年龄在 SQLite 数据库中存储为 null,则在查询对象时,ormlite 填充为 0。我想避免这种情况并确保将年龄设置为空。有什么办法可以实现吗?

【问题讨论】:

  • 我很好奇你为什么使用 useGetSet 而不是让它使用反射?
  • 我没有使用useGetSet的具体原因。正在尝试。使用useGetSet 会对我的应用程序的性能产生负面影响吗?
  • 不,只是它不是默认设置,我很好奇。反射是默认设置。

标签: android ormlite


【解决方案1】:

正确的做法是不要将dataType 指定为@DatabaseField 注释的一部分。然后ORMLite 将正确使用DataType.SHORT_OBJ 字段类型。由于您要覆盖默认字段类型并说 Short 字段实际上是一个原语,如果 ORMLite did 为其分配了 null,则会导致 NPE,因此它会分配 0。您的数据对象应该是:

@DatabaseField(columnName="NAME", useGetSet=true)
private String name;

@DatabaseField(columnName = "AGE", useGetSet = true)
private Short age;

真的,您永远不需要指定 dataType,除非您正在覆盖某些内容或 ORMLite 无法做出良好的自动类型确定(例如:byte[])。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2016-07-22
    • 2013-05-11
    • 2021-10-06
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多