0

私はsqliteの初心者です。私がやろうとしていること...ゲームがあり、ゲームが終了すると、時間の結果が経過秒という名前の double 変数に格納されます。その結果をデータベースに配置し、専用のアクティビティでユーザーのトップ 10 スコアを表示したいと考えています。データベースを作成するHighScoreDbクラスがあります(オンラインで見つけたコードを使用しましたが、目的に役立つと思います)。これがコードです。

public class HighScoreDb {
    private static class HighScoreDbHelper extends SQLiteOpenHelper {

    public HighScoreDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        try {
        db.execSQL(SCORE_TABLE_CREATE);
        } catch (SQLException e) {
        Log.i("Error", "Error making database");
        e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + SCORE_TABLE_NAME);
        onCreate(db);
    }

    }

    private static final int DATABASE_VERSION = 2;
    private static final String SCORE_TABLE_NAME = "highscore";
    private static final String SCORE_TABLE_CREATE = "CREATE TABLE "
                             + SCORE_TABLE_NAME
                             + " (_id INTEGER PRIMARY KEY autoincrement, "
                             + "name TEXT NOT NULL, score DOUBLE  NOT NULL)";
    private static final String DATABASE_NAME = "highscores.db";
    // The index (key) column name for use in where clauses.
    public static final String KEY_ID = "_id";

    // The name and column index of each column in your database.
    public static final String KEY_NAME = "name";
    public static final String KEY_SCORE = "score";
    public static final int NAME_COLUMN = 1;
    public static final int NUMBER_COLUMN = 2;
    public static final int SCORE_COLUMN = 3;

    SQLiteDatabase db;
    private final Context ctx;
    private final HighScoreDbHelper dbHelper;

    public HighScoreDb(Context context) {
    this.ctx = context;
    ctx.deleteDatabase(SCORE_TABLE_NAME);
    dbHelper = new HighScoreDbHelper(context);
    db = dbHelper.getWritableDatabase();
    }

    public void close() {
    if (db != null) {
        db.close();
    }

    }

    public void createRow(String name, int score) {
    ContentValues intialValue = new ContentValues();
    intialValue.put("name", name);
    intialValue.put("score", score);
    db.insertOrThrow(SCORE_TABLE_NAME, null, intialValue);

    }

    public void deleteRow(long rowId) {
    db.delete(SCORE_TABLE_NAME, "_id=" + rowId, null);
    }

    public Cursor GetAllRows() {
    try {
        return db.query(SCORE_TABLE_NAME, new String[] { "_id", "name", "score" }, null,
                null, null, null, "score DESC");
    } catch (SQLException e) {
        Log.i("Error on query", e.toString());
        return null;
    }

    }

    public void updateRow(long _id, String name, String score) {
    ContentValues args = new ContentValues();
    args.put("name", name);
    args.put("number", score);
    db.update(SCORE_TABLE_NAME, args, "_id=" + _id, null);
    }

}

このテーブルから、列名は必要ありません。スコアが 10 か所だけになるためです。ゲーム終了後にその結果をこのデータベースに挿入する方法は? 私はそれから読む方法を知っていると思います、私はこのようなことをします:

HighScoreDb db = new HighScoreDb(this);
Cursor myCursor = db.GetAllRows();
myCursor.moveToPosition(0);
    String Row1Value2 = myCursor.getString(2);
myCursor.close();
db.close();

私は自分のゲームクラスで次のように呼び出しています:

HighScoreDb db = new HighScoreDb(this);
4

2 に答える 2

0

データベースを開く方法は問題ありません。

カーソルを使用して行に関する特定の情報を取得する代わりに、テーブル内の行を表すエンティティを作成します。カーソルからの情報を使用して、これらのオブジェクトのリストを作成します。

public UserScore {
    String name;
    Integer score; // don't know why you would use double here.

    // getters + setters or make it immutable
}

私が提供するのは、新しいスコアを追加するためのHighScoreDb内のメソッドです。たとえば署名付き

public void addScore(UserScore userScore);

10スコアを追加するだけではなく、すべてのスコアをデータベースに追加します。トップ10のスコアが必要なときはいつでも。最後の10スコアを降順にクエリするだけです。それ以外の場合は、クエリで簡単に実行できる多くの複雑さをプログラミングしています。これを行うには、上位N個のクエリを調べます。

ヘルパー内のDBへの書き込みの例は、次のようになります(SQLはテストしていませんが、この形式である必要があります)

this.getWritableDatabase().execSQL("insert into highscore (name, score) values (" + userScore.getName() + "," + userScore.getScore() + ")");
于 2013-03-07T14:31:41.597 に答える
0

私はあなたの質問を理解しているかどうかわかりません...あなたのデータベースにいくつかのデータを入れるには、以下に書いた関数を正しく使用する必要があります(私はあなたのクラスが正常に動作していると仮定します)、例えば:

HighScoreDbHelper myDbHelper = new HighScoreDbHelper(yourContext);
myDbHelper.createRow(yourName, yourScore);

このチュートリアルは、sqlite の概念の良いスターターです: http://www.vogella.com/articles/AndroidSQLite/article.html

于 2013-03-07T14:28:30.647 に答える