我在使用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
答案 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
实例。