如何在ORMLite中使用不同的外键?

时间:2014-05-27 10:06:54

标签: android ormlite

我在ORMLite中遇到外键问题我有2个类QuestionDb和ResponsesDb如下:

public class ResponsesDb {

    public static final String FIELD_ID = "id";

    @DatabaseField(generatedId = true,columnName=FIELD_ID)
    private int id;
    @DatabaseField(canBeNull = false, foreign = true, foreignColumnName=QuestionDb.FIELD_REF)
    private QuestionDb question;
    @DatabaseField(canBeNull = false)
    private String answer;
 }

并且:

@DatabaseTable(tableName = "question")
public class QuestionDb implements Serializable {

    public static final String FIELD_REF = "ref";

    private static final long serialVersionUID = 4106020204304605623L;


    @DatabaseField(generatedId = true)
    private int id;
    @DatabaseField(canBeNull = false, unique = true, columnName=FIELD_REF, index=true)
    private String ref;
    @ForeignCollectionField(foreignFieldName = "question", eager = true)
    private ForeignCollection<ResponsesDb> responses;
}

我的问题是当我这样做时:

    QueryBuilder<QuestionDb, Integer> questionQuery = helper
            .getQuestionDao().queryBuilder();
    QueryBuilder<ResponsesDb, Integer> responseQuery = helper
            .getResponseDao().queryBuilder();
    responseQuery = responseQuery.join(questionQuery);

我接受了:

05-27 12:00:01.577: W/System.err(7272): java.sql.SQLException: Could not find a foreign class model.ormlite.tableClass.ResponsesDb field in class model.ormlite.tableClass.QuestionDb or vice versa

但是,如果我从ResponsesDb中的问题字段注释中删除字段foreignColumnName=QuestionDb.FIELD_REF,则查询有效。

事实是,当我的程序更新数据库时,id字段可以更改,所以我希望外键是ref。你知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

可以使用字符串作为外键。你不能做的是定义一个外键,其中foreignColumnName 不是另一个对象的键

来自ORMLite documentation中的示例:

  

对于外来对象,只保留帐户中的 id 字段   在Order表中作为列&#34; account_id&#34;。

在这种情况下,您有QuestionDb

@DatabaseField(generatedId = true)
private int id;

generatedId注释意味着这是表的id。将ref标记为unique将创建唯一索引,但它不会使其成为候选键。因此,它不能用作另一个表的外键。

简而言之:如果你需要一个字符串外键,那么你可以。只需在引用的表格中定义一个字符串主键。(即删除id字段并将@DatabaseField(id = true)放在ref字段中。

更进一步,更加强大,我不明白你为什么声称:

  

事实是,当我的程序更新数据库时,id字段可以   变化

插入后,{em> 值 值不会更改。它非常适合用作外键! :)