2017-02-19 85 views
0

我有一个查询(getMinScore),它从我的表中取最小值,我需要这一点,并在文本字段,但它显示它的当前状态,它会显示返回SQLite的查询和返回文本

High Score: [email protected] 

我不知道这是什么意思,我怎么能从这个字符串值?

我在我的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); 
+0

告诉我们所有的错误,请 –

+0

这就是我所看到的,其余的显示颜色的固体块之后。 – jb2002

回答

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的读,了解光标的方法。

+0

'min()'总是返回一个值。 –

0

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

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

确保通过检查光标计数> ZERO来检查返回的光标不是NULL。

更改方法

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 
    } 
} 
+1

'min()'总是返回一个值。 –

+0

我加了检查只是为了避免这个例外。如果有的话。 –

+0

什么例外?没有任何表行,'min()'会返回一个NULL值的结果行,'getInt()'将转换为'0'。 –

0

你应该总是关闭游标,以防止内存泄露

所以

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(); 
}