两个标识列

时间:2013-06-06 07:43:23

标签: java android ormlite

我正在使用ORMlite,我想知道是否有可能在一个表中有多个标识列。

我有一个包含两个特定列的表:ID和Number。如果ID和Number相同,我希望ORMlite只更新行,否则它应该创建一个新行。我正在使用方法createOrUpdate

感谢。

2 个答案:

答案 0 :(得分:2)

  

如果ID和Number相同,我希望ORMlite只更新行,否则它应该创建一个新行(我使用方法createOrUpdate)。

是的,你不能使用createOrUpdate(...)但是你应该能够添加自己的DAO方法来很好地模拟它。如果ID不是唯一的,那么您需要创建另一个ID字段作为标识,并使用ID作为另一个字段,可能会uniqueCombo限制。

@DatabaseField(generatedId = true)
private int uniqueId;
// not the id field because it is not unique
@DatabaseField
private int id;
@DatabaseField
private int number;

在DAO类中,覆盖BaseDaoImpl类并覆盖createOrUpdate(...)方法。它应该做类似的事情:

public CreateOrUpdateStatus createOrUpdate(Foo data) throws SQLException {
    QueryBuilder<Foo, Integer> qb = queryBuilder();
    // NOTE: id here is not the identity field
    qb.where().eq("id", data.id).and().eq("number", data.number);
    Foo existing = qb.queryForFirst();
    if (existing == null) {
        int numRows = create(data);
        return new CreateOrUpdateStatus(true, false, numRows);
    } else {
        int numRows = update(data);
        return new CreateOrUpdateStatus(false, true, numRows);
    }
}

作为优化,您可以使用ThreadLocalSelectArg参数为id和number args预先创建该查询,然后只需设置args并在createOrUpdate(...)方法中运行查询。

答案 1 :(得分:1)

阅读本文和ORMLite文档; Multiple primary keys - ORMlite

我不是100%肯定答案。 uniqueCombo = true似乎是一个很好的猜测,但我不确定更新和删除等内容是否仍然有用。你必须自己测试一下。