关键字:Cursor、moveToFitst()、getString()、
今儿写获取数据库数据时候遇到了使用cursor.getString()的方法,结果运行的时候app直接崩溃。
//获取所有log信息
public List<String> getAllLog(String UserID){
List<String> list = new ArrayList<>();
String LogRowInfo = "";
String sql1 = "select * from LogTable where UserID=?"; //查询账号署下的日志信息
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery(sql1,new String[]{UserID});
cursor.moveToFirst();
cursor.moveToNext();
//int LogIDIndex = cursor.getColumnIndex(COL_Serial); //单条数据ID
int LogUIDIndex = cursor.getColumnIndex(COL_UserID); //用户ID
int LogDNameIndex = cursor.getColumnIndex(COL_DName); //设备名字
int LogTimeIndex = cursor.getColumnIndex(COL_Time); //操作时间
int LogOpertypeIndex = cursor.getColumnIndex(COL_Opertype); //操作类型
int LogResultIndex = cursor.getColumnIndex(COL_Result); //操作结果
String LogUID = cursor.getString(LogUIDIndex);
String LogDName = cursor.getString(LogDNameIndex);
String LogTime = cursor.getString(LogTimeIndex);
String LogOpertype = cursor.getString(LogOpertypeIndex);
String LogResult = cursor.getString(LogResultIndex);
if(cursor.moveToFirst()) {
do {
//用户ID:1001于2023-12-01-24:14修改厨房传感器 结果:成功
LogRowInfo = String.format("用户ID:%s 于%s%s%s 结果:%s", LogUID, LogTime, LogOpertype, LogDName, LogResult);
list.add(LogRowInfo);
}
while (cursor.moveToNext());
}
cursor.close();
return list;
}
我寻思也用了moveToFirst(); getString()也没问题,咋出错了呢?后面查了半天才搞懂。
简单来说就是使用cursor的时候,会有个指针一样的东西,在我使用getColumnIndex()方法的时候,指针已经跳到其它地方了,而在getColumnIndex()使用完后,这个指针并不会自己复位。所以在这种情况下,接下去使用getString()方法便会出错溢出。
所以修改办法是在使用完getColumnIndex()后加一句cursor.moveToFirst();将指针复位,然后再使用getString()。
//int LogIDIndex = cursor.getColumnIndex(COL_Serial); //单条数据ID
int LogUIDIndex = cursor.getColumnIndex(COL_UserID); //用户ID
int LogDNameIndex = cursor.getColumnIndex(COL_DName); //设备名字
int LogTimeIndex = cursor.getColumnIndex(COL_Time); //操作时间
int LogOpertypeIndex = cursor.getColumnIndex(COL_Opertype); //操作类型
int LogResultIndex = cursor.getColumnIndex(COL_Result); //操作结果
cursor.moveToFirst();
String LogUID = cursor.getString(LogUIDIndex);
String LogDName = cursor.getString(LogDNameIndex);
String LogTime = cursor.getString(LogTimeIndex);
String LogOpertype = cursor.getString(LogOpertypeIndex);
String LogResult = cursor.getString(LogResultIndex);