我正在使用ORMlite,我想知道是否有可能在一个表中有多个标识列。
我有一个包含两个特定列的表:ID和Number。如果ID和Number相同,我希望ORMlite只更新行,否则它应该创建一个新行。我正在使用方法createOrUpdate
。
感谢。
答案 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
似乎是一个很好的猜测,但我不确定更新和删除等内容是否仍然有用。你必须自己测试一下。