Взять информацию из базы данных всегда возвращает -1 - PullRequest
0 голосов
/ 08 июля 2019

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

DatabaseHelper databaseHelper = new DatabaseHelper(this);
Cursor data = databaseHelper.getInformation();
if(!data.moveToFisrt()) {
    databaseHelper.addInformation(0, 0, 0);
}

Теперь я начинаю второе действие, которое реализует пользовательское представление. В этом упражнении я реализую настраиваемое представление, а внутри настраиваемого представления обновляю строку, ранее созданную в основном упражнении, затем вызываю метод adInformation следующим образом

SecondActivity

private CustomView cv;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);    
    cv= new CustomView(this);
    setContentView(R.layout.activity_game);
}

CustomView

//all the constructors call init()
private void init(Context context){
        /***/
        databaseHelper = new DatabaseHelper(getContext());
        int w, l, d;
        Cursor data = databaseHelper.getInformation();
        w = data.getColumnIndex(String.valueOf(1));
        l = data.getColumnIndex(String.valueOf(2));
        d = data.getColumnIndex(String.valueOf(3));
        //here w,l,d are -1
    }

Это мой помощник по базе данных

public class DatabaseHelper extends SQLiteOpenHelper {


    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table "+TABLE_NAME1+" (ID INTEGER PRIMARY KEY AUTOINCREMENT, W INT, D INT, L INT)");
        //i have a second table
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME1);
        onCreate(db);
    }

    public boolean addInformation(int w, int l, int d){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        if(w != -1) {
            values.put("W", w);
        }
        if(d != -1)
            values.put("D", d);
        if(l != -1)
            values.put("L", l);

        long id = db.insert(TABLE_NAME1, null, values);

        db.close();
        if(id == -1)
            return false;
        else
            return true;

    }

    public Cursor getInformation(){
        SQLiteDatabase db = this.getReadableDatabase();
        String query = "SELECT * FROM " + TABLE_NAME1;
        Cursor c = db.rawQuery(query,null);
        return c;
    }
}

Я также отмечаю, что моя база данных содержит вторую таблицу. Эта вторая вкладка заполняется в пользовательском представлении, а затем отображается, когда я возвращаюсь к основному виду деятельности. Записи, вставленные в пользовательское представление, правильно отображаются в основном действии. Более того, если в пользовательском представлении мне нужно было сначала вызвать getInformation, затем addInformation (5,5,5) и после getInformation () он вернет -1

1 Ответ

1 голос
/ 08 июля 2019

getColumnIndex превращает имя столбца в номер столбца.Если ваши столбцы не названы «1», «2» и «3», этот код неверен.Я думаю, что вы хотели getInt(getColumnIndex("name of column"))

Помните, что порядок столбцов, возвращаемых SELECT *, является произвольным, поэтому не предполагайте, что в 1, 2 и 3. Вместо этого используйте код, который я выложил выше с "W "," D "и" L "

...