我没有在日志中打印“名称”和“年龄”?(最后提到了错误。)

时间:2018-06-24 20:44:43

标签: sqlite android-sqlite

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

    }
}

错误是

  

:: E / CursorWindow:无法从CursorWindow读取第0行,第-1列   有18行2列。

1 个答案:

答案 0 :(得分:0)

尝试删除该应用程序的数据并重新运行。

-1表示未找到列。该消息还指示仅2列,而不是3列(ID,名称和年龄),因此缺少一列(因此,年龄或名称为-1)。如果存在数据库,则openOrCreate将打开数据库,因此将不应用对结构的任何更改(除非您做了ALTER TABLE ADD COLUMN your_missing_column columntype,您不想在重复代码中这样做,因为它只会运行一次)

另外检查游标是否为null是没有用的,请改用while(c.moveToNext()) { ...... }并删除行c.moveToFirst();(如果可以进行移动,那么move方法将返回true,否则返回false,因此为什么可以使用{{ 1}}来遍历光标)。

封装在try / catch块中往往会使事情变得混乱。所以我建议:-

while(c.moveToNext()) {....}