#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
)