如何在Android上使用ORMLite直接设置“手动”外键?

时间:2015-03-10 10:25:20

标签: android foreign-keys ormlite

我在使用ORMLite时遇到了一些问题。我确定这是一个非常简单的问题,但还找不到任何解决方案。

基本上,我正在尝试直接使用其密钥创建另一个对象的外键。

代码看起来通常应该如下:

public class A { }

public class B {
    @DatabaseField(foreign = true)
    public A mA;
}

但我正在努力做到这一点(因为A太大了,无法随处携带;我只保留其ID)

public class A { }

public class B {
    @DatabaseField() // How can I do that?
    public long mA_Id;
}

有没有人已经成功做到了这一点?最终,我希望有“on delete cascade”约束。

谢谢!

修改

试过:

@DatabaseField(foreign = true, foreignColumnName = DatabaseContract.A._ID)        
public long mA_Id;

但它崩溃了:

Caused by: java.lang.IllegalArgumentException:
    Field FieldType:name=mA_Id,class=B is a primitive class long but marked as foreign

2 个答案:

答案 0 :(得分:2)

@DatabaseField(foreign = true)
private A mA;

在内部,ORMLite会在mA_id表格中存储A字段(可能是字符串名称),但您不必担心这一点。请记住,当您查询B时,A字段中设置的B只会设置ID字段。要让ORMLite也查找帐户,您需要设置foreignFieldAutoRefresh=true

正如@colletjb所指出的,这里有一些关于这个主题的文档。我们在文档上花了很长时间,所以它应该会有所帮助。

Foreign objects
Foreign auto refresh

此外,还有一些example code about foreign fields

希望这有帮助。

答案 1 :(得分:1)

  

但是我试图这样做(因为A太大而无法在任何地方继续进行;我只保留其ID)

首先,正如@vishalk所提到的,ORMLite仅在A中保留B的id字段。当您检索B时,它会构建A,但只会填充id字段。

但是,如果您只想手动存储id字段,那么您当然可以这样做。现在ORMLite不会产生外键约束,因此我只需将它设为long a_id并保留它即可。然后,您可以在需要时使用id来获取关联的A实例。