如何使用GSON模型处理Android中的OrmLite ForeignCollection字段

时间:2012-09-09 21:50:44

标签: android ormlite foreign-collection

所以,我有一些OrmLite 4.41模型类,最初由GSON填充(为简洁起见,已简化)

public class Crag {
  @DatabaseField(id=true) private int id;
  @ForeignCollectionField(eager=true, maxEagerLevel=2) @SerializedName("CragLocations")
  private Collection<CragLocation> cragLocations;
}

public class CragLocation {
    @DatabaseField(id=true) private int id;
    @DatabaseField private int locationType;
    @DatabaseField(foreign=true, foreignAutoCreate=true, foreignAutoRefresh=true)
    private Crag crag;  
    @DatabaseField(foreign=true, foreignAutoCreate=true, foreignAutoRefresh=true)
    private Location location;
}

public class Location {
    @DatabaseField(id=true) private int id;
    @DatabaseField private BigDecimal latitude;
    @DatabaseField private BigDecimal longitude;
}

我正在测试事情正在发生,因为我期待......

@Test
public void canFindById() {
    Crag expected = ObjectMother.getCrag431();
    _repo.createOrUpdate(template431);
    Crag actual = _repo.getCragById(431);
    assertThat(actual, equalTo(template431));
}

他们不平等......为什么不呢?因为在GSON创建的对象中(在ObjectMother.getCrag431()中),Crag的cragLocations字段是一个ArrayList,在OrmLite加载的那个字段中,它是一个EagerForeignCollection

我在这里错过了一招吗?有没有办法告诉OrmLite我想要哪种类型的Collection?我应该只有一个方法将集合作为一个arraylist返回并测试它的相等性吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

  

有没有办法告诉OrmLite我想要哪种类型的Collection?

没有办法做到这一点。当ORMLite返回Crag时,它将是EagerForeignCollectionLazyForeignCollection

  

我应该只有一个方法将集合作为一个arraylist返回并测试它的相等性吗?

我假设在您的Crag.equals(...)方法中,您正在测试cragLocations字段的相等性为this.cragLocations.equals(other.cragLocations)。这是行不通的,因为正如你猜测的那样,它们是不同的类型。

如果需要测试相等性,可以将它们作为数组提取。类似的东西:

Array.equals(
    this.cragLocations.toArray(new CragLocation[this.cragLocations.size()]),
    other.cragLocations.toArray(new CragLocation[this.cragLocations.size()]));