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

SQLite跨表查询报错:找不到details表,求解决方案

问题排查与解决

核心错误原因

报错no such table: details说明SQLite数据库中不存在名为details的表,结合Room的特性,大概率是实体类配置或数据库版本的问题。

具体排查与修复步骤

  • 检查Details实体类的注解配置
    确保details对应的实体类正确添加了@Entity注解,并且指定的表名是details:

    @Entity(tableName = "details")
    data class DetailsEntity(
        @PrimaryKey val details_id: Int,
        // 其他字段
    )
    

    如果遗漏@Entity注解,或者tableName参数写错,Room不会自动创建该表。

  • 更新数据库版本
    如果是新增的details表,必须更新Room数据库的版本号,否则旧数据库文件中不会包含这个表:

    @Database(entities = [PokemonItemEntity::class, DetailsEntity::class], version = 2) // 版本号+1
    abstract class AppDatabase : RoomDatabase() {
        // DAO定义
    }
    

    开发阶段可以临时添加fallbackToDestructiveMigration(),让Room重建数据库(会清空数据,仅用于测试):

    Room.databaseBuilder(context, AppDatabase::class.java, "app_db")
        .fallbackToDestructiveMigration()
        .build()
    
  • 核对表名一致性
    确认DAO查询语句中的表名和实体类@Entity(tableName)的配置完全一致,SQLite虽然大小写不敏感,但要避免拼写错误。另外注意你描述中的items表,代码里查询的是pokemons,需确认PokemonItemEntity的表名是否确实是pokemons。

  • 可选:改用JOIN查询
    你的需求也可以通过JOIN语句实现,写法更直观,同时能验证表是否存在:

    @Query("SELECT i.* FROM pokemons i JOIN details d ON i.item_id = d.details_id")
    fun pagingSourceOffline(): PagingSource<Int, PokemonItemEntity>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:42:57