Попробуйте удалить данные приложения и перезапустить.
-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)));
}
}