返回SQLite查询并作为文本返回

时间:2017-02-19 20:44:25

标签: java android sqlite

我有一个查询(getMinScore),它从我的表中获取最小值,我需要将其显示在文本字段中,但在其显示的当前状态

High Score: android.database.SQLiteCursor@.......

我不知道这意味着什么,如何从中获取字符串值?

我在我的GameView类中调用查询,就像在第二个代码块中一样。非常感谢任何帮助!

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "scores.db";
public static final String TABLE_NAME = "scores_table";
public static final String COLUMN_ID = "ID";
public static final String COLUMN_SCORE = "SCORE";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME +" (ID INTEGER PRIMARY KEY AUTOINCREMENT, SCORE INTEGER)");
}

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

public boolean insertData(String score) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_SCORE, score);
    long result = db.insert(TABLE_NAME, null, contentValues);
    System.out.println("Data inserted" + score);

    if(result == -1) {
        return false;
    }
    else {
        return true;
    }

}

public Cursor getAllData() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select * from " + TABLE_NAME, null);
    return res;
}

public Cursor getMinScore() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select min (SCORE) from " + TABLE_NAME, null);
    return res;
}

public boolean updateData(String id, String score) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_ID, id);
    contentValues.put(COLUMN_SCORE, score);
    db.update(TABLE_NAME, contentValues, "ID = ?", new String[] { id });
    return true;
}

public Integer deleteData(String id) {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete(TABLE_NAME, "ID = ?", new String[] { id });
}
}

GameView.java

String minScore = mydb.getMinScore().toString();
TextPaint tp = new TextPaint();
tp.setColor(Color.GREEN);
tp.setTextSize(40);
tp.setTypeface(Typeface.create("Courier", Typeface.BOLD));
canvas.drawText("Moves: " + String.valueOf(turns), 10, 1180, tp);
canvas.drawText("High score: " + mydb.getMinScore(), 10, 1280, tp);

3 个答案:

答案 0 :(得分:0)

Cursor是一个对象,通过迭代行,您可以访问数据库查询的结果。你不能打印出光标,你需要检查是否有下一行,然后从中拉出值。

您可以更改getMinScore方法以返回minScore值,而不是返回光标:

public int getMinScore() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select min (SCORE) from " + TABLE_NAME, null);

    if(res.moveToNext()) {
        // return the integer from the first column
        return res.getInt(0);
    } else {
        // there were no results
        return -1;
    }
}

阅读documentation以了解光标方法。

答案 1 :(得分:0)

您必须从返回的Cursor对象中获取值。在您的情况下,您可以使用

int score = res.getInt(res.getColumnIndex("SCORE"));

请务必通过检查光标数>来检查返回的光标是否为NULL。 ZERO。

更改方法

public Cursor getMinScore() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("select min (SCORE) from " + TABLE_NAME, null);
return res;

}

public int getMinScore() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select min (SCORE) from " + TABLE_NAME, null);
    if (res.getCount() > 0) {
        return res.getInt(res.getColumnIndex("SCORE"));
    } else {
        return -1; // Some defualt value when no data is retrieved 
    }
}

答案 2 :(得分:0)

你应该总是关闭Cursor以防止内存泄漏

所以

   public int getMinScore() {
        int result = -1;

        Cursor res = db.rawQuery("select min (SCORE) from " + TABLE_NAME, null);

        if (res.moveToFirst()) {
            result = res.getInt(0);
        }

        if (!res.isClosed()){

            res.close();
        }
        return result;
    }
}

我认为用户方法打开和关闭更好,而不是每次都调用getWritableDatabase()

public void open() {
    bdd = dbHelper.getWritableDatabase();
}

public void close() {
    bdd.close();
}