Android应用设备运行时闪退,调用db.getAllTasks()报错求排查
问题定位与修复方案
以下是导致崩溃的核心错误及修复方案,按优先级排序:
1. getAllTasks方法查询表名参数完全错误
你在query方法第一个参数写了String.valueOf(Boolean.parseBoolean(TODO_TABLE)),TODO_TABLE是字符串常量"todoTable",无法被解析为布尔值,运行时会直接抛出IllegalArgumentException导致崩溃。
修复:直接传入表名常量即可,修改为:
Cursor sqlcursor = db.query(TODO_TABLE, null, null, null, null, null, null, null)
2. 数据库建表语句语法错误
建表语句拼接时TASK字段后面缺少空格,你写的是+ TASK +"TEXT, ",拼接后生成的语句会出现taskDescTEXT的错误字段名,导致taskDesc字段创建失败,后续读写该字段时抛出字段不存在的异常。
修复:在TEXT前加空格,修改为:
private static final String CREATE_TODO_TABLE="CREATE TABLE "+ TODO_TABLE+" ( "+ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + TASK +" TEXT, "+STATUS+ " INTEGER)";
注意:修改建表语句后需要卸载重装APP,或者升级数据库版本号触发onUpgrade重建表,否则旧表结构不会更新
3. MainActivity中Adapter初始化顺序错误
你初始化ToDoAdapter的时候,db实例还没有创建,此时传入Adapter的是null,如果Adapter内部有调用db的逻辑会直接触发空指针崩溃。
修复:调整初始化顺序,先初始化db,再创建Adapter:
db=new Databases(this); db.openDatabse(); taskAdapter=new ToDoAdapter(db,this); taskRecyclerView.setAdapter(taskAdapter);
4. 不必要的事务使用问题
getAllTasks是只读操作,不需要开启事务,你当前开启事务后也没有调用db.setTransactionSuccessful(),虽然读操作不会有回滚问题,但冗余的事务逻辑会增加异常概率,建议直接删除事务相关代码,优化后的getAllTasks参考:
public List<ToDoModel> getAllTasks(){ List<ToDoModel> taskList =new ArrayList<>(); try (Cursor sqlcursor = db.query(TODO_TABLE, null, null, null, null, null, null, null)) { if (sqlcursor != null && sqlcursor.moveToFirst()) { do { ToDoModel thisTask = new ToDoModel(); int idIndex = sqlcursor.getColumnIndex(ID); int taskIndex = sqlcursor.getColumnIndex(TASK); int statusIndex = sqlcursor.getColumnIndex(STATUS); // 提前判断字段索引是否合法,避免异常 if(idIndex != -1) thisTask.setId(sqlcursor.getInt(idIndex)); if(taskIndex != -1) thisTask.setEachtask(sqlcursor.getString(taskIndex)); if(statusIndex != -1) thisTask.setStatus(sqlcursor.getInt(statusIndex)); taskList.add(thisTask); } while (sqlcursor.moveToNext()); } } return taskList; }
内容的提问来源于stack exchange,提问作者Siddhi Bhardwaj
相关产品推荐
相关产品推荐

