Я не получаю «Имя» и «Возраст» в журналах? (В конце упоминается ошибка). - PullRequest
0 голосов
/ 24 июня 2018
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try{
            SQLiteDatabase myDatabase=this.openOrCreateDatabase("User",MODE_PRIVATE,null);
            myDatabase.execSQL("CREATE TABLE IF NOT EXISTS user(name VARCHAR,age INTEGER(2),id INTEGER PRIMARY KEY )");
            myDatabase.execSQL("INSERT INTO user(name,age) VALUES('gaurav',20)");
            myDatabase.execSQL("INSERT INTO user(name,age) VALUES('saurav',16)");

            Cursor c=myDatabase.rawQuery("SELECT * FROM user",null);
            int nameIndex=c.getColumnIndex("name");
            int ageIndex=c.getColumnIndex("age");


            c.moveToFirst();
            while(c!=null){
                Log.i("Name",c.getString(nameIndex));
                Log.i("Age", Integer.toString(c.getInt(ageIndex)));  //tring to get this things in logs but instead it shows an error.
                c.moveToNext();
            }
        } catch (Exception e){
            e.printStackTrace();
        }

    }
}

ОШИБКА IS

:: E / CursorWindow: не удалось прочитать строку 0, столбец -1 из CursorWindow, имеющего 18 строк, 2 столбца.

1 Ответ

0 голосов
/ 25 июня 2018

Попробуйте удалить данные приложения и перезапустить.

-1 означает, что столбец не найден. В сообщении также указываются только 2 столбца, а не 3 (идентификатор, имя и возраст), поэтому один отсутствует (следовательно, -1 для возраста или имени). openOrCreate откроет базу данных, если она существует, поэтому любые изменения в структуре не будут применены (если, скажем, вы не сделали ALTER TABLE ADD COLUMN your_missing_column columntype, что не требуется делать при повторении кода, поскольку это будет работать только один раз)

Кроме того, проверка курсора на null бесполезна, вместо этого используйте while(c.moveToNext()) { ...... } и удалите строку c.moveToFirst(); (методы перемещения возвращают true, если перемещение можно сделать, иначе false, поэтому вы можете использовать while(c.moveToNext()) {....} для циклического просмотра курсор).

Инкапсуляция в блоке try / catch приводит к путанице. Поэтому я бы предложил: -

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SQLiteDatabase myDatabase=this.openOrCreateDatabase("User",MODE_PRIVATE,null);
    myDatabase.execSQL("CREATE TABLE IF NOT EXISTS user(name VARCHAR,age INTEGER(2),id INTEGER PRIMARY KEY )");
    myDatabase.execSQL("INSERT INTO user(name,age) VALUES('gaurav',20)");
    myDatabase.execSQL("INSERT INTO user(name,age) VALUES('saurav',16)");

    Cursor c=myDatabase.rawQuery("SELECT * FROM user",null);
    int nameIndex=c.getColumnIndex("name");
    int ageIndex=c.getColumnIndex("age");

    while(c.moveToNext()) {
        Log.i("Name",c.getString(nameIndex));
        Log.i("Age", Integer.toString(c.getInt(ageIndex)));
    }
}
...