我正在使用糖orm作为高分数据库,经过大量搜索(因为文档非常纯净,而且有些链接已经死了),我已经设法保存并列出数据库中的记录。遗憾的是,我无法找到如何删除重复的分数记录,或者如何更新记录而不是保存新记录,以防名称和高分值相同。 我发现这可以通过以下方式完成:
getWritableDatabase().execSQL("delete from highscores where _id not in (SELECT MIN(_id ) FROM highscores GROUP BY highscores_id)");
}
但我怎么能用糖orm来做呢,我不知道它是否有id字段或它的名字?
更新 按照@Juancortes的建议我正在尝试检查当前玩家,如果数据库中存在当前得分,则在添加记录之前:
private void saveScore(){
int total;
total=checkList();
if(total>0) {
HighScoresDB highScores = new HighScoresDB(tvPlName.getText().toString(), total);
highScores.save();
}
}
private int checkList(){
String tempName=tvPlName.getText().toString();
List<HighScoresDB> check = HighScoresDB.find(HighScoresDB.class, "person = ?",tempName);
ArrayList<Integer> templist = new ArrayList<Integer>();
for(int i=0;i<check.size();i++){
templist.add(check.get(i).score);
}
int total = Integer.valueOf(totalPts.getText().toString());
if(templist.contains(total)) {
total = 0;
}else{
total=Integer.valueOf(totalPts.getText().toString());
}
return total;
}
我得到一个列表,其中包含使用糖orm的当前玩家的现有记录。在我检查列表是否包含当前得分值之后,如果为真,我将其设置为“0”。然后在“saveScore()”方法中,仅当分数值大于“0”时才保存记录。但这不起作用,我不断获得双倍,三倍等记录。我做错了什么?
更新2: 似乎“包含”不适用于直接包含数据库对象的列表。所以我创建了一个只有分数的ArrayList(代码也更新了),我使用该列表来检查总数是否存在。现在似乎工作正常,并没有创建双重记录。
答案 0 :(得分:0)
有点晚了,但您可以将executeQuery()方法用于原始自定义查询。以下是将删除重复项的查询示例:
DELETE tableName FROM tableName LEFT OUTER JOIN(
SELECT MIN(table_primary_key) AS rowId, col1, col2, col3
FROM tableName
GROUP BY col1, col2, col3
) as KeepRows ON tableName.table_primary_key = KeepRows.rowId
WHERE KeepRows.rowId IS NULL
比较所有行,找到任何重复行,删除它们。
这将在SQL中执行,而不必撤回所有记录,但您可以将其修改为SELECT,然后使用SugarORM删除功能。这会增加内存使用量。