糖orm,如何删除重复记录?

时间:2015-07-15 09:15:41

标签: android database android-sqlite sugarorm

我正在使用糖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(代码也更新了),我使用该列表来检查总数是否存在。现在似乎工作正常,并没有创建双重记录。

1 个答案:

答案 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删除功能。这会增加内存使用量。