我在我的Android应用程序中使用ORMLite,并且在某些情况下我需要sqlite的INSERT OR UPDATE
功能。我知道ORMLite有createOrUpdate
但它并不适用于我的特定情况。
我将以一个例子来解释我的案例。我有两张桌子A
& B
。它们之间具有多对多关系,使用单独的映射表M
表示。表格A
& B
已手动生成主键,M
使用generatedId = true
。 M
中的两列将外键存储到A
& B
已设置uniqueCombo = true
。因此,当我尝试调用M
时createOrUpdate
中已经存在UNIQUE
中已存在的后端(作为JSON)的记录时,它将在public CreateOrUpdateStatus createOrUpdate(T data) throws SQLException {
if (data == null) {
return new CreateOrUpdateStatus(false, false, 0);
}
ID id = extractId(data);
// assume we need to create it if there is no id
if (id == null || !idExists(id)) {
int numRows = create(data);
return new CreateOrUpdateStatus(true, false, numRows);
} else {
int numRows = update(data);
return new CreateOrUpdateStatus(false, true, numRows);
}
}
约束上失败。原因是
id
如上所示,如果要保留模型中没有UNIQUE
,则会执行更新语句,因为id
约束会失败,但是因为{{1} }列是自动生成的,我不知道这个(我可以使用这个独特的组合查询表&然后找到id
,但是在我的模式中有很多这样的表并且具有自定义逻辑为所有表做这件事会是一场噩梦!)
为了解决这个问题,我计划使用sqlite的INSERT OR REPLACE
,它会在冲突时删除现有记录并将其替换为新记录。来自sqlite docs
When a UNIQUE or PRIMARY KEY constraint violation occurs, the REPLACE algorithm deletes
pre-existing rows that are causing the constraint violation prior to inserting or
updating the current row and the command continues executing normally
这是我想实现它的方式 - 让ORMLite准备一个INSERT
语句,然后用INSERT
替换INSERT OR REPLACE
然后执行该语句。我的问题是ORMLite中是否有任何钩子可以让我这样做(得到INSERT
语句)?