【问题标题】:Android Room [SQLITE_ERROR] SQL error or missing database when using Relation and JunctionAndroid Room [SQLITE_ERROR] 使用关系和连接时出现 SQL 错误或缺少数据库
【发布时间】:2020-02-22 20:31:29
【问题描述】:

这是我的第一个问题。

我正在使用 Room 数据库构建应用程序,并尝试遵循 this 教程,因为我需要实现多对多关系。

但是,当我尝试构建应用程序时,我不断收到以下错误:

错误:查询有问题:[SQLITE_ERROR] SQL 错误或缺少数据库(没有这样的表:OwnerDogCrossRef) private final java.util.List dogs= null;

我的实体,带有交叉引用数据类:

@Entity(tableName = "owner_table")
data class Owner(
    @ColumnInfo(name = "owner_id")
    val id: String,

    @PrimaryKey
    @ColumnInfo(name = "owner_name", index = true)
    val name: String,
    // some other columns

@Entity(tableName = "dog_table")
data class Dog(
    @PrimaryKey
    @ColumnInfo(name = "dog_name")
    val name: String
    // some other columns

@Entity(primaryKeys = ["owner_name", "dog_name"])//, "move_learned_by"])
data class OwnerDogCrossRef(
    val owner_name: String,
    @ColumnInfo(index = true)
    val dog_name: String
    // some other columns

我的联结数据类:

data class OwnerWithDogs(
    @Embedded val owner: Owner,

    @Relation(
        parentColumn = "owner_name",
        entityColumn = "dog_name",
        associateBy = Junction(OwnerDogCrossRef::class)
    )
    val dogs: List<Dog>
)

我的 DAO:

@Dao
inteface OwnerDao {
    @Transaction
    @Query("SELECT * FROM owner_table WHERE owner_name = :name")
    fun getOwnerWithDogs(name: String): LiveData<List<OwnerWithDogs>>
}

我还将 OwnerDogCrossRef 添加到我的数据库中,如下所示:

@Database(
    entities = [Owner::class, Dog::class, OwnerDogCrossRef::class],
    version = 2,
    exportSchema = false
)
@TypeConverters(Converters::class)
abstract class MainDatabase : RoomDatabase() {
    //some logic
}

感谢您的帮助

【问题讨论】:

    标签: android kotlin android-room


    【解决方案1】:

    转到您的 Database.kt 文件并确保交叉引用表已包含在其中的实体列表中。您的可能与下面的示例有所不同,但我希望您能看到您可能遗漏的内容。

    @Database(entities = [Owner::class, Dog::class, OwnerDogCrossRef::class], version = 1)
    abstract class AppDatabase : RoomDatabase() {
    
    ...
    
    }
    

    这是因为 OwnerDogOwnerDogCrossRef 都是数据库需要知道的表,而 OwnerWithDogs 只是要加入事务中的相关表,因为将运行多个查询,根据documentation。另请参阅 here 了解数据库文档,了解如何包含特定数据库的实体。

    【讨论】:

      【解决方案2】:
      data class OwnerWithDogs(
          @Embedded val owner: Owner,
      
          @Relation(
              parentColumn = "owner_name",
              entity = Dog.class,
              entityColumn = "dog_name",
              associateBy = @Junction(
              value=OwnerDogCrossRef.class,
              parentColumn = "owner_name",//variable name in your OwnerDogCrossRef
              entityColumn = "dog_name")
          )
          val dogs: List<Dog>
      )
      

      试试这个代码。 如需更多想法,请尝试此链接
      https://developer.android.com/reference/androidx/room/Junction

      【讨论】:

      • 我刚试过你的方法,但它给了我同样的错误
      猜你喜欢
      • 2017-12-23
      • 2018-01-19
      • 2014-06-03
      • 2013-06-01
      • 2017-02-11
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2016-08-14
      相关资源
      最近更新 更多