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

Android Studio+Kotlin中SQL COUNT(*)查询始终返回0求助

Android Studio中SQLite COUNT(*)查询始终返回0的排查方案

我是Android Studio和Kotlin的初学者,尝试执行简单的COUNT(*)查询,但结果始终返回0。试过各种方法仍未找到问题,怀疑遗漏了必要配置。

相关信息:

  • 数据库放置在Main/assets目录下
  • 日志显示:successfully opened database lvl_database
  • 数据库包含两行已填充数据,表名与列名和代码完全一致

代码示例

class DatabaseHelper(context: Context) : SQLiteAssetHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
   companion object {
        private const val DATABASE_NAME = "lvl_database"
        private const val DATABASE_VERSION = 1
    }
}

class SubLevel : AppCompatActivity() {

    private lateinit var dbHelper: DatabaseHelper

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sublevel)

        dbHelper = DatabaseHelper(this)
        val db: SQLiteDatabase = dbHelper.writableDatabase

        // 用try-catch处理异常
        try {
            val cursor: Cursor = db.rawQuery("SELECT COUNT(*) FROM Levels", null)
            val textView: TextView = findViewById(R.id.Sublevel_title)

            if (cursor.moveToFirst()) {
                val count = cursor.getInt(0)
                textView.text = "Levels表总行数 : $count"
                Log.d("DatabaseDebug", "Levels表计数: $count")
            } else {
                textView.text = "Levels表中无数据"
                Log.d("DatabaseDebug", "游标为空或无法移动到第一条数据。")
            }
            cursor.close()
        } catch (e: Exception) {
            Log.e("DatabaseError", "访问数据库出错: ${e.localizedMessage}")
        } finally {
            db.close()
        }
    }
}

排查步骤

  1. 验证数据库是否正确复制到设备
    SQLiteAssetHelper会将assets中的数据库复制到应用私有目录,但复制失败时会创建空数据库。可以通过以下方式检查:
  • 打开Android Studio的Device File Explorer,找到应用数据目录:data/data/[你的应用包名]/databases/lvl_database
  • 将该文件导出到本地,用SQLite工具(如SQLiteStudio)打开,确认Levels表中存在数据。
  1. 检查表名大小写一致性
    SQLite在Linux环境(Android基于Linux)下大小写敏感,确认本地数据库的表名是Levels还是levels,代码中的查询语句必须完全匹配。

  2. 添加日志排查数据库复制状态
    修改DatabaseHelper类,添加日志输出,确认数据库是否被正确复制:

class DatabaseHelper(context: Context) : SQLiteAssetHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
    companion object {
        private const val DATABASE_NAME = "lvl_database"
        private const val DATABASE_VERSION = 1
    }

    override fun onCreate(db: SQLiteDatabase?) {
        super.onCreate(db)
        Log.d("DBHelper", "创建了新数据库(原assets数据库可能未复制成功)")
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        super.onUpgrade(db, oldVersion, newVersion)
        Log.d("DBHelper", "数据库从版本$oldVersion升级到$newVersion")
    }
}

如果日志打印创建了新数据库,说明assets中的数据库未成功复制,可能是文件名错误、文件损坏或权限问题。

  1. 确认表是否存在
    在代码中添加查询,验证Levels表是否存在:
val tableCheckCursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='Levels'", null)
if (tableCheckCursor.moveToFirst()) {
    Log.d("DBDebug", "Levels表存在")
} else {
    Log.d("DBDebug", "Levels表不存在")
}
tableCheckCursor.close()
  1. 检查本地数据库文件完整性
    用SQLite工具打开assets目录下的lvl_database文件,确认数据正常且文件未损坏。同时确保文件名与代码中的DATABASE_NAME完全一致(如果数据库文件带.db后缀,代码中也要对应写上)。

内容的提问来源于stack exchange,提问作者julien mantovani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:05:15