1

私はハイスコアデータベースにsugar ormを使用しています。多くの検索の後(ドキュメントが非常に純粋で、リンクが死んでいるため)、データベースからレコードを保存して一覧表示することができました。残念ながら、重複したスコア レコードを削除する方法や、名前とハイ スコアの値が同じ場合に新しいレコードを保存する代わりにレコードを更新する方法がわかりません。これは次のような方法で実行できることがわかりました。

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

しかし、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;
}

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 に答える