Android Комната [SQLITE_ERROR] SQL Ошибка или отсутствует база данных при использовании связи и соединения - PullRequest
1 голос
/ 22 февраля 2020

это мой первый вопрос здесь.

Я создаю приложение, используя базу данных Room, и я попытался следовать этому руководству, потому что мне нужно реализовать отношение «многие ко многим».

Тем не менее, я продолжаю получать следующую ошибку, как только я пытаюсь построить приложение:

ошибка: есть проблема с запросом: [SQLITE_ERROR] SQL ошибка или отсутствует база данных (нет такой таблицы: OwnerDogCrossRef) частный конечный 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
}

Спасибо за ваше помощь

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Go в ваш файл Database.kt и убедитесь, что таблица перекрестных ссылок включена в список сущностей. Ваш может отличаться от приведенного ниже примера, но я надеюсь, что вы можете увидеть, что вы, возможно, пропустили.

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

...

}

Это потому, что Владелец , Собака , и OwnerDogCrossRef - это все таблицы, о которых база данных должна знать, тогда как OwnerWithDogs просто собирается объединить соответствующие таблицы в транзакции, так как будет выполняться несколько запросов согласно документация . См. Также здесь для документации базы данных, показывающей, как включить сущности для конкретной базы данных.

0 голосов
/ 23 февраля 2020
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

...