Как исправить 'database.CursorIndexOutOfBoundsException: индекс 0 запрошен, с размером 0'? - PullRequest
0 голосов
/ 04 мая 2019

Я настраиваю базу данных с помощью Android SQLite для своей функции weight_activity с помощью диалогового окна. В этой операции я сохраняю текущий вес и хочу запросить сохраненное значение для текущего веса при запуске упражнения, чтобы отобразить его.

Ошибка, которую я получаю:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.thisfit/com.example.thisfit.Weight_Activity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
        at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)

Это код, который запрашивает текущий вес в моем классе активности

    public void getCurrentWeightAsFloat() {
        textView_currentWeight.setText(String.valueOf(weight_dbHandler.getCurrentWeight()));
    } //public void getCurrentWeightAsFloat()

Это весь код базы данных. Я публикую это, потому что не знаю, может ли проблема быть в другом разделе кода, а не только в методе getCurrentWeight ():

public class Weight_Database extends SQLiteOpenHelper {

    //region Attributes
    private static final String TAG = "weight_database";
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "weight_database.db";
    private static final String TABLE_NAME = "weight_table";
    private static final String COL1 = "ID";
    private static final String COL2 = "Weight";
    private static final String COL3 = "Date";
    //endregion





    //region Constructors
    public Weight_Database(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
//        SQLiteDatabase db = this.getWritableDatabase();
    }
    //endregion





    //region Methods

    @Override
    public void onCreate(SQLiteDatabase db) {

        String createTable = "CREATE TABLE " + TABLE_NAME
                + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, "
                + COL2 + " FLOAT, "
                + COL3 + " DATE )";
        db.execSQL(createTable);
    }



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



    public boolean addNewCurrentWeightAsFloat(float newCurrentWeightAsFloat){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL2, newCurrentWeightAsFloat);

        Log.d(TAG, "addWeight: Adding " + newCurrentWeightAsFloat + " to " + TABLE_NAME);

        long result = db.insert(TABLE_NAME, null, contentValues);

        //if date as inserted incorrectly it will return -1
        if (result == -1){
            return false;
        } else {
            return true;
        }
    } //public boolean addNewCurrentWeightAsFloat(String newCurrentWeightAsFloat)



    public float getCurrentWeight(){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT Weight FROM " + TABLE_NAME + " ORDER BY ID DESC LIMIT 1";
        Cursor data = db.rawQuery(query, null);
        data.moveToFirst();

        float currentWeightAsFloat = data.getFloat(data.getColumnIndex("content"));

        return currentWeightAsFloat;
    } //public float getCurrentWeight()



    //Returns the whole table as a raw query
    public Cursor getData(){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_NAME;
        Cursor data = db.rawQuery(query, null);
        return data;
    } //public Cursor getData()


    //endregion





} //class Weight_Database

Я ожидаю получить последний введенный вес, выбрав ID DESCending с пределом 1. Я хочу получить значение с плавающей точкой моего текущего веса и впоследствии отобразить его в textView.

Хорошего дня и заранее спасибо:)

1 Ответ

1 голос
/ 04 мая 2019

В вашей таблице нет данных.

Вам следует проверить возвращаемые значения data.moveToFirst() и пытаться вызывать getFloat() на курсоре только в том случае, если он вернул true.

...