Android应用跳转Activity时SQLiteHelper空对象引用错误如何解决
问题根因
- 静态SQLiteHelper实例未初始化:你代码中调用的
ScannedDetails.sqLiteHelper是全局静态实例,直接打开SecondActivity时,该实例还没有完成初始化就被调用,所以触发空指针异常。先打开FirstActivity能正常使用,是因为FirstActivity的执行逻辑中已经完成了该Helper实例的初始化。 - Adapter未初始化:你声明了
InventoryListAdapter adapter = null;,但全程没有给adapter创建实例,加载完数据后直接调用adapter.notifyDataSetChanged(),就算数据库问题解决,这里也会触发第二次空指针。 - 潜在建表逻辑缺失:你自定义的SQLiteHelper中
onCreate方法是空的,没有写入CgList表的建表语句,如果没有在其他地方执行过建表操作,首次运行查询时也会抛出表不存在的异常。
解决方案
- 优先在SecondActivity中初始化SQLiteHelper,不要依赖其他页面的初始化逻辑,调用数据库操作前先判断实例是否存在:
// 放在调用getData前执行 if (ScannedDetails.sqLiteHelper == null) { // 替换为你自己的数据库名、版本号 ScannedDetails.sqLiteHelper = new SQLiteHelper(SecondActivity.this, "cg_database.db", null, 1); }
- 补全SQLiteHelper的建表逻辑,确保首次创建数据库时表能正常生成:
@Override public void onCreate(SQLiteDatabase sqLiteDatabase) { // 字段要和你插入、查询的字段完全对应 sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS CgList (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "cash_card TEXT," + "hh_number TEXT," + "series_number TEXT," + "cc_image BLOB," + "id_image BLOB)"); }
- 初始化Adapter,调用通知刷新前确保实例已创建:
list.clear(); // 这里放你加载数据库数据到list的逻辑 // 处理adapter逻辑 if (adapter == null) { // 替换为你自己的列表项布局、列表控件实例 adapter = new InventoryListAdapter(this, R.layout.item_inventory, list); inventoryListView.setAdapter(adapter); } else { adapter.notifyDataSetChanged(); }
优化建议
- 查询返回的Cursor使用完要及时关闭,避免内存泄漏,同时增加空判断避免异常:
Cursor cursor = null; try { cursor = ScannedDetails.sqLiteHelper.getData("SELECT id,cash_card,hh_number,series_number,id_image FROM CgList limit 500"); list.clear(); // 先判断cursor有效性,再遍历 if (cursor != null && cursor.moveToFirst()) { do { int id = cursor.getInt(0); String cashCardNumber = cursor.getString(1); String hhNumber = cursor.getString(2); String seriesNumber = cursor.getString(3); byte[] CashCardImage = cursor.getBlob(4); list.add(new Inventory(cashCardNumber, hhNumber,seriesNumber, CashCardImage, id)); } while (cursor.moveToNext()); } } finally { if (cursor != null) { cursor.close(); } }
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

