这里面会不断的更新我在原生SQL语句的时候发现的问题异常总结:
(1)大小写问题:
比如你的创建表的时候语句如下:
db.execSQL("create table if not exists Person(_id Integer PRIMARY KEY AUTOINCREMENT,NAME varchar(32),AGE varchar(32))");你的插入语句如下:
public boolean insert(List<Person> persons) {boolean flag = true;ContentValues values = new ContentValues();for (Person person : persons) {values.clear();values.put("name", person.getName());values.put("age", person.getAge());long person1 = mDb.insert("Person", null, values);flag = person1 > 0;}return flag;}查询语句如下:
public List<Person> query() {List<Person> persons = new ArrayList<>();Cursor cursor = mDb.rawQuery("select * from Person", null);while (cursor.moveToNext()) {Person person = new Person();try {person.setName(cursor.getString(cursor.getColumnIndex("name")));person.setAge(cursor.getString(cursor.getColumnIndex("age")));persons.add(person);} catch (Exception e) {Log.i(TAG, e.toString());}}cursor.close();return persons;}你会一直查询不到数据,我这里其实做了try catch ,如果不做try catch就会崩掉的,打印日志如下:
java.lang.IllegalStateException: get field slot from row 2 col -1 failed肯定会十分的不解,在debug的时候发现走到了查询操作的person.setName哪里,里面的cursor.getColumnIndex返回的是-1,但是就TM想喷了,表里面明明有这个字段怎么返回的是-1,其实你再仔细看看就会发现表里面的“name”是大写的NAME,而你这里是小写的。你改成大写就会发现可以顺利执行了:
public List<Person> query() {List<Person> persons = new ArrayList<>();Cursor cursor = mDb.rawQuery("select * from Person", null);while (cursor.moveToNext()) {Person person = new Person();try {person.setName(cursor.getString(cursor.getColumnIndex("NAME")));person.setAge(cursor.getString(cursor.getColumnIndex("AGE")));persons.add(person);} catch (Exception e) {Log.i(TAG, e.toString());}}cursor.close();return persons;}改成大写之后就能查询到数据了。所以注意大小写,在插入数据到表的时候是不区分大小写的,但是在查询的时候就会区分大小写了。是不是很骚气。
后面发现新的问题会再继续添加进来的。