You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用跳转Activity时SQLiteHelper空对象引用错误如何解决

问题根因

  • 静态SQLiteHelper实例未初始化:你代码中调用的ScannedDetails.sqLiteHelper是全局静态实例,直接打开SecondActivity时,该实例还没有完成初始化就被调用,所以触发空指针异常。先打开FirstActivity能正常使用,是因为FirstActivity的执行逻辑中已经完成了该Helper实例的初始化。
  • Adapter未初始化:你声明了InventoryListAdapter adapter = null;,但全程没有给adapter创建实例,加载完数据后直接调用adapter.notifyDataSetChanged(),就算数据库问题解决,这里也会触发第二次空指针。
  • 潜在建表逻辑缺失:你自定义的SQLiteHelper中onCreate方法是空的,没有写入CgList表的建表语句,如果没有在其他地方执行过建表操作,首次运行查询时也会抛出表不存在的异常。

解决方案

  1. 优先在SecondActivity中初始化SQLiteHelper,不要依赖其他页面的初始化逻辑,调用数据库操作前先判断实例是否存在:
// 放在调用getData前执行
if (ScannedDetails.sqLiteHelper == null) {
    // 替换为你自己的数据库名、版本号
    ScannedDetails.sqLiteHelper = new SQLiteHelper(SecondActivity.this, "cg_database.db", null, 1);
}
  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)");
}
  1. 初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:57:05