2017-02-19 4 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

A 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")); 

Обязательно проверьте, что возвращаемый курсор не равен 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 
    } 
} 
+1

'min()' всегда возвращает значение. –

+0

Я добавил чек, чтобы избежать исключения. Если есть. –

+0

Какое исключение? Без каких-либо строк таблицы 'min()' будет возвращать строку результатов со значением NULL, которое 'getInt()' будет конвертировать в '0'. –

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

 Смежные вопросы

  • Нет связанных вопросов^_^