2016-07-14 110 views
0

我在我的项目之一使用ormlite和我有一个类A定制型F的领域f,我有那场f不应该在任何空的要求案件。所以我想实例化的F级新对象每当场F在数据库文件处理空的情况下

class A { 
    @DatabaseField(columnName = "xyz", persisterClass = FieldPersister.class) 
    F f; 

    public A() { 
     f = new F(); 
    } 
} 

按照使用自定义的持留FieldPersister类,并试图在那里空检查我的文档NULL。

class FieldPersister extends StringType { 
    public Object javaToSqlArg(FieldType fieldType, Object javaObject) { 
     ... 
    } 

    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) { 
     if (sqlArg == null) return new F(); 
     else { 
      String value = (String) sqlArg; 
      return new F(value); 
     } 
    } 
} 

我试着调试程序,发现已经有下面的方法空校验

resultToJava(FieldType fieldType, DatabaseResults results, int columnPos) 

即使重写此方法并没有得到解决,这导致我的问题的问题,在那里任何方式来处理这种情况,或者我错过了部分难题?

更新与SSCCE:

pom.xml

Main.java

StringPropertyPersister.java

+1

我已经更新了测试程序的帖子,看看它是否有帮助。 – calvin

回答

0

即使重写此方法并没有得到解决,这导致我的问题的问题,有没有什么办法处理这种情况,还是我错过了部分难题?

你错过了谜题的一部分,它非常微妙。不幸的是,ResultSet.getInt(...)方法返回一个int。为什么这很重要?由于ORMLite无法判断数据库中的字段是否为NULL,如果它是原语,则无法判断该字段是否为NULL。所以通常发生的事情是ORMLite从ResultSet获得结果,要求它由自定义转换器进行转换,然后ORMLite会看到它是否为空并适当调整值。也许有更好的方法来做到这一点。我需要考虑一下。

这里有几个解决方案。

  1. 将您的字段定义添加一个defaultValue = ""。如果磁盘上存在NULL值,则不会处理此情况,但如果您使用的是dao.create(...),则该值将起作用。如果字段为空,则可以使用FieldConverter.parseDefaultString(...)来定义要插入的默认对象。

  2. 在您的A.getValue()方法中,您将执行null检查,如果为空,则返回new SimpleStringProperty("")。但那么你的示例代码可能过于简单。

  3. 的黑客是同时覆盖resultToJava(...)方法是这样的:

    @Override 
    public Object resultToJava(FieldType fieldType, DatabaseResults results, 
         int columnPos) throws SQLException { 
        // remove the null check here so we can handle the null 
        Object value = resultToSqlArg(fieldType, results, columnPos); 
        return sqlArgToJava(fieldType, value, columnPos); 
    } 
    

    但你也需要重写这是一个黑客以下。

    @Override 
    public boolean isStreamType() { 
        // this forces the null check to be ignored 
        return true; 
    } 
    

    这是一个黑客,因为如果ORMLite巧妙地改变它处理“流” SQL类型的方式,它可能会破坏你的代码。

    查看我的测试版本:CustomFieldNullTest.java

+0

谢谢!有效。我使用了第三种解决方案,因为我已将NULL存储在磁盘上。 – calvin

相关问题