1

我将sugar orm用于高分数据库,经过大量搜索(因为文档非常纯粹,而且有些链接已经失效),我设法保存并列出了数据库中的记录。不幸的是,我不知道如何删除重复的分数记录,或者如何更新记录而不是保存新记录,以防名称和高分值相同。我发现这可以通过以下方式完成:

getWritableDatabase().execSQL("delete from highscores where _id not in (SELECT MIN(_id ) FROM highscores GROUP BY highscores_id)");
}

但是我怎么能用我不知道它是否有一个 id 字段或它的名字的糖 orm 呢?

更新: 按照@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;
}

我得到了一个列表,其中包含当前使用 Sugar orm 的玩家的现有记录。在我检查列表是否包含当前分值后,如果为真,我将其设置为“0”。然后在“saveScore()”方法中,仅当分值大于“0”时才保存记录。但这不起作用,我不断获得双倍、三倍等记录。我做错了什么?

更新2: 似乎“包含”不适用于直接包含数据库对象的列表。所以我创建了一个只有分数的 ArrayList(代码也更新了),我使用该列表来检查总数是否存在。现在似乎工作正常并且不会创建双重记录。

4

1 回答 1

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

于 2015-08-12T15:11:05.177 回答