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() } } }
排查步骤
- 验证数据库是否正确复制到设备
SQLiteAssetHelper会将assets中的数据库复制到应用私有目录,但复制失败时会创建空数据库。可以通过以下方式检查:
- 打开Android Studio的Device File Explorer,找到应用数据目录:
data/data/[你的应用包名]/databases/lvl_database - 将该文件导出到本地,用SQLite工具(如SQLiteStudio)打开,确认Levels表中存在数据。
检查表名大小写一致性
SQLite在Linux环境(Android基于Linux)下大小写敏感,确认本地数据库的表名是Levels还是levels,代码中的查询语句必须完全匹配。添加日志排查数据库复制状态
修改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中的数据库未成功复制,可能是文件名错误、文件损坏或权限问题。
- 确认表是否存在
在代码中添加查询,验证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()
- 检查本地数据库文件完整性
用SQLite工具打开assets目录下的lvl_database文件,确认数据正常且文件未损坏。同时确保文件名与代码中的DATABASE_NAME完全一致(如果数据库文件带.db后缀,代码中也要对应写上)。
内容的提问来源于stack exchange,提问作者julien mantovani
相关产品推荐
相关产品推荐

