Комната 2.5 вложенные отношения один к одному, многие к одному

#android #kotlin #nested #relationship #android-room

#Android #kotlin #вложенный #отношения #android-room

Вопрос:

Комната

У меня есть отношения, подобные этой головоломке -> имеет один-> диалог -> имеет много -> диалоговых строк

Я следовал инструкциям на https://developer.android.com/training/data-storage/room/relationships#kotlin но все еще не могу заставить это работать

Это ошибки, которые, по-видимому, связаны:

ошибка: не удается найти столбец дочерних объектов puzzleDialogueId в com.example.puzzleherexamenandroid.data.room.databaseModels.Диалог с Linesdatabase.

Пробовал следующие конструкторы, но им не удалось сопоставить: PuzzleWithDialogueDatabase (com.example.puzzleherexamenandroid.data.room.databaseModels.База данных PuzzleDatabase,com.example.puzzleherexamenandroid.data.room.databaseModels.DialogueWithLinesDatabase) -> [параметр: головоломка -> сопоставленное поле: головоломка, параметр: dialogueWithLines -> сопоставленный field:unmatched]C:UsersJasperStudioProjectsPuzzleHerexamenAndroidappbuildtmpkapt3stubsdebugcomexamplepuzzleherexamenandroiddataroomdatabaseModelsPuzzleWithDialogueDatabase.java:9 : ошибка: Не удается найти параметр для поля.

PuzzleDatabaseDao.java:12: ошибка: Тип параметра должен быть классом, аннотированным @Entity, или его коллекцией / массивом. java.util.List<com.example.puzzleherexamenandroid.data.room.databaseModels.PuzzleWithDialogueDatabase> головоломка);

это мои сущности

 @Entity(tableName = "puzzle_table")
@Parcelize
data class PuzzleDatabase (
     @PrimaryKey
     val puzzleId: Int,
     val title: String,
     val prompt: String,
     val answer: String

): Parcelable 
  
  @Entity(tableName = "dialogue_table")
@Parcelize
data class DialogueDatabase (
    @PrimaryKey
    val dialogueId: Int,
    val prompt: String,
    val char1avatar: String,
    val char2avatar: String,
    val puzzleDialogueId : Int
): Parcelable
  
 @Entity(tableName = "dialogueLine_table")
@Parcelize
data class DialogueLineDatabase (
    @PrimaryKey
    val dialogueLineId: Int,
    val line: String,
    val speaking: Int,
    val dialogueForeignkeyId: Int
    ): Parcelable
  

это классы для отношений

 data class PuzzleWithDialogueDatabase(
    @Embedded val puzzle : PuzzleDatabase,
    @Relation(
        entity = DialogueWithLinesDatabase::class,
        parentColumn = "puzzleId",
        entityColumn = "puzzleDialogueId"
    )
    val dialogueWithLines: DialogueWithLinesDatabase
)
  
 data class DialogueWithLinesDatabase(
    @Embedded val dialogue:DialogueDatabase,
    @Relation(
        parentColumn = "dialogueId",
        entityColumn = "dialogueForeignkeyId"
    )
    val dialogueLines: List<DialogueLineDatabase>
)
  

И это мой doa

 @Dao
interface PuzzleDatabaseDao {
   @Transaction
   @Insert(onConflict = OnConflictStrategy.IGNORE)
   fun insertAll(puzzle: List<PuzzleWithDialogueDatabase>)

   @Transaction
   @Query("SELECT * from puzzle_table ORDER BY puzzleId DESC")
   fun getAllPuzzles(): LiveData<List<PuzzleWithDialogueDatabase>>
}
  

Комментарии:

1. Ответы, похоже, решают только вашу первую ошибку. Во-вторых, вы не можете использовать классы отношений в качестве параметров для методов insert или update. Я считаю, что это серьезный недостаток Room, потому что это затрудняет сохранение сложных отношений обратно в базу данных. Даже документация, похоже, скрывает этот факт, потому что все примеры сохранения или обновления являются тривиальными случаями, такими как вставка (пользователь)

Ответ №1:

Я думаю, вам следует изменить сущность DialogueWithLinesDatabase на DialogueDatabase внутри вашего PuzzleWithDialogueDatabase определения Releation класса:

 data class PuzzleWithDialogueDatabase(
    @Embedded val puzzle : PuzzleDatabase,
    @Relation(
        entity = DialogueDatabase::class, // <- changed
        parentColumn = "puzzleId",
        entityColumn = "puzzleDialogueId"
    )
    val dialogueWithLines: DialogueWithLinesDatabase
)
  

Ответ №2:

Свойство entity в @Relation должно указывать объект базы данных, а не класс отношений. Попробуйте:

 data class PuzzleWithDialogueDatabase(
    @Embedded val puzzle : PuzzleDatabase,
    @Relation(
        entity = DialogueDatabase::class,
        parentColumn = "puzzleId",
        entityColumn = "puzzleDialogueId"
    )
    val dialogueWithLines: DialogueWithLinesDatabase
)