Android Room [SQLITE_ERROR] 使用 Relation 和 Junction 时出现 SQL 错误或缺少数据库

Fab*_*nna 1 android kotlin android-room

这是我在这里的第一个问题。

我正在使用 Room 数据库构建一个应用程序,我尝试按照教程进行操作,因为我需要实现多对多关系。

但是,一旦我尝试构建应用程序,我就会不断收到以下错误:

错误:查询有问题:[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
Run Code Online (Sandbox Code Playgroud)

我的连接数据类:

data class OwnerWithDogs(
    @Embedded val owner: Owner,

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

我的道:

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

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

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

感谢您的帮助

Red*_*Red 6

转到您的Database.kt文件并确保交叉引用表已包含在那里的实体列表中。你的可能与下面的例子不同,但我希望你能看到你可能遗漏了什么。

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

...

}
Run Code Online (Sandbox Code Playgroud)

这是因为OwnerDogOwnerDogCrossRef都是数据库需要了解的表,而OwnerWithDogs只是将相关表连接到事务中,因为根据文档,将运行多个查询。另请参阅此处的数据库文档,其中显示了如何包含特定数据库的实体。


Jee*_*eva 0

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>
)
Run Code Online (Sandbox Code Playgroud)

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