0

私のデータベースは上位10件のレコードを保持しています。データベースが空の場合、データベースはスコアを記録し、10 レコードになるまでスコアを正しく挿入します。次に、たとえば、データベースに 10 個のスコアがあり、ユーザーが新しい 1 番のスコアになるはずのスコアを取得した場合、現在の 1 番のスコアを新しいスコアに置き換えます。下位スコアを削除します。うまく説明できれば幸いですが、コメントするだけでなく、さらに明確にするよう努めます。

私の質問は、ハイスコアがすでに 10 個のレコードでいっぱいになっている場合、新しいレコードが正しい場所に挿入され、その下の残りのレコードがすべて 1 つ下に移動され、最後のレコードが取得されるように、ハイスコアを正しく実行するにはどうすればよいかということです。完全にぶつかりました(新しい#11であるため)。

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper { 

    SQLiteDatabase db;

    private static final int DATABASE_VERSION = 6; 
    private static final String DB_NAME = "test3"; 
    private static final String DB_PATH = "/data/data/matt.lyons.bibletrivia/databases/";
    private static final String TABLE = "HighscoresList"; 

    // Table columns names. 
    private static final String RANK = "_id"; 
    private static final String SCORE = "score"; 
    private static final String PERCENTAGE = "percentage";
    private static final String TOTAL_SCORE = "total_score";
    private static final String CATEGORY = "category";

    //Constructor for a DatabaseHelper.
    public DatabaseHelper(Context context) { 
        super(context, DB_NAME, null, DATABASE_VERSION); 
    }

    //Open the DB so it is editable.
    public SQLiteDatabase openDB() {
        db = this.getWritableDatabase();
        return db;
    }

    //Delete a selected one row.
    public void delete(long lowScore) {
        lowScore = getLowest();
        db.delete(TABLE, TOTAL_SCORE + "=" + lowScore, null);
    }

    //Sort rows in order of the TOTAL_SCORE column.
    public long getLowest() {
        Cursor c = db.rawQuery("SELECT * FROM " + TABLE + " ORDER BY " + TOTAL_SCORE, null);
        long count = c.getCount();
        long lowScore = -1;
        if(count == 10) {
            c.moveToLast();
            lowScore = c.getInt(c.getColumnIndex(TOTAL_SCORE));
        }
        return lowScore;
    }

    //Calculate the TOTAL_SCORE based on the SCORE and PERCENTAGE of a game.
    public long calculateTotalScore(long score, int percentage) {
        long i;
        return i = (percentage * 1000) + score;
    }

    //Check if new record makes the top 10.
    public long check(long score, int percentage, long sum) {
        Cursor c = db.rawQuery("SELECT " + TOTAL_SCORE + " FROM " + TABLE, null);
        long count = c.getCount();
        long low_score;
        if(count == 10) {
            c.moveToLast();
            low_score = c.getInt(c.getColumnIndex(TOTAL_SCORE));
            return low_score;
        } else {
            return count;
        }
    }

    //Insert new record.
    public long insert(long score, int percentage, long total_score, String category) {
        ContentValues values = new ContentValues();
        values.put(SCORE, score);
        values.put(PERCENTAGE, percentage);
        values.put(TOTAL_SCORE, total_score);
        values.put(CATEGORY, category);

        return db.insert(TABLE, null, values);
    }

    //Create the table and all columns.
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE + " ("
                + RANK + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + SCORE + " LONG,"
                + PERCENTAGE + " INTEGER,"
                + CATEGORY + " STRING,"
                + TOTAL_SCORE + " LONG"
                + ");");
    }
}

結果.java

public class Results extends Activity {

    DatabaseHelper dh;

    public void onCreate(Bundle savedInstanceState) {

        dh = new DatabaseHelper(this);
        dh.openDB();
        showResults();
    }

    public void showResults() {

        total_score = dh.calculateTotalScore(score, percentage);
        if(dh.getLowest() == -1) {
            dh.insert(score, percentage, total_score, category);
        } else {
            dh.delete(dh.getLowest());
            dh.insert(score, percentage, total_score, category);
        }
    }
}
4

1 に答える 1

1

それだけではない理由:

"SELECT LIMIT 10 * FROM " + TABLE + " ORDER BY TOTAL_SCORE DESC"

そうすれば、常に挿入/削除しなくてもトップ 10 スコアを取得できますか?

于 2013-02-18T15:48:53.913 に答える