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

SQLite CRUD操作问题:数据插入成功但查询Cursor始终为空

问题分析与修复方案

嘿,我仔细扒了你的代码,立刻就找到两个核心问题——这就是为啥你明明看到“插入成功”的提示,却搜不到任何数据的根源:


1. 插入操作根本没真正执行

你的btnInsert点击事件里,只是写了插入的SQL字符串,但完全没调用数据库去执行这条语句!而且原SQL还有语法错误:字符串类型的字段值没加单引号,就算你执行了也会直接报错,根本插不进去数据。

修复插入代码:

推荐用ContentValues来封装数据插入,这比直接拼SQL字符串更安全,还能避免手动加引号的麻烦:

btnInsert.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String name = edname.getText().toString().trim();
        String phn = edphone.getText().toString().trim();
        String addr = edaddress.getText().toString().trim();

        // 先做个简单的输入校验(可选,但很实用)
        if (name.isEmpty() || phn.isEmpty()) {
            Toast.makeText(DB.this, "请填写姓名和电话", Toast.LENGTH_SHORT).show();
            return;
        }

        // 用ContentValues封装数据,自动处理字符串引号,避免SQL注入和语法错误
        ContentValues values = new ContentValues();
        values.put("Name", name);
        values.put("phone", phn);
        values.put("address", addr);

        // 执行插入,返回插入的行ID,-1表示插入失败
        long result = db.insert("Info", null, values);
        if (result != -1) {
            Toast.makeText(DB.this, "数据插入成功", Toast.LENGTH_SHORT).show();
            // 清空输入框(可选优化)
            edname.setText("");
            edphone.setText("");
            edaddress.setText("");
        } else {
            Toast.makeText(DB.this, "数据插入失败", Toast.LENGTH_SHORT).show();
        }
    }
});

如果非要用execSQL,那必须给字符串值加单引号(但不推荐,容易出问题),而且一定要加上执行语句:

String query = "INSERT INTO Info (Name,phone,address) VALUES('"+name+"','"+phn+"','"+addr+"')";
db.execSQL(query); // 关键!之前就是缺了这句才没插入数据

2. 搜索操作没执行查询,Cursor完全没初始化

你的btnSearch点击事件里,cursor一开始就被设为null,根本没去数据库查询数据,所以cursor.moveToNext()必然是false,一直提示“cursor is null”。

修复搜索代码:

先执行查询获取Cursor,再处理结果,还要记得用完关闭Cursor避免内存泄漏:

btnSearch.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Cursor cursor = null;
        try {
            // 执行查询,这里查全表数据,你也可以加条件比如按姓名搜索
            cursor = db.rawQuery("SELECT * FROM Info", null);
            
            // 先判断Cursor是否有效且有数据
            if (cursor != null && cursor.getCount() > 0) {
                Toast.makeText(DB.this, "共找到 "+cursor.getCount()+" 条数据", Toast.LENGTH_SHORT).show();
                // 遍历Cursor取出每条数据
                while (cursor.moveToNext()) {
                    String name = cursor.getString(cursor.getColumnIndex("Name"));
                    String phone = cursor.getString(cursor.getColumnIndex("phone"));
                    String address = cursor.getString(cursor.getColumnIndex("address"));
                    Toast.makeText(DB.this, "姓名:"+name+" | 电话:"+phone, Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(DB.this, "未找到任何数据", Toast.LENGTH_LONG).show();
            }
        } catch (Exception ex){
            Toast.makeText(DB.this, "ERROR: "+ ex.toString(), Toast.LENGTH_LONG).show();
        } finally {
            // 必须关闭Cursor,防止内存泄漏
            if (cursor != null) {
                cursor.close();
            }
        }
    }
});

额外小建议

  1. 数据库操作尽量放在子线程,避免阻塞主线程(不过你的是简单Demo,暂时可以先这样)
  2. 表字段名尽量统一大小写,比如都用小写name、phone,避免混淆
  3. 给表加个主键,比如ID INTEGER PRIMARY KEY AUTOINCREMENT,方便后续的更新和删除操作

内容的提问来源于stack exchange,提问作者Saboor Siddique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:28:30