这里面会不断的更新我在原生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;
}
改成大写之后就能查询到数据了。所以注意大小写,在插入数据到表的时候是不区分大小写的,但是在查询的时候就会区分大小写了。是不是很骚气。
后面发现新的问题会再继续添加进来的。