#android #android-room
#Android #android-комната
Вопрос:
Учитывая
@Entity(
tableName = "state",
foreignKeys = arrayOf(
ForeignKey(entity = Foo::class, parentColumns = arrayOf("id"), childColumns = arrayOf("foo_id")),
ForeignKey(entity = Bar::class, parentColumns = arrayOf("id"), childColumns = arrayOf("bar_id"))
)
)
data class State(
@PrimaryKey(autoGenerate = true) val id: Long = 1
) {
@ColumnInfo(name = "foo_id")
var fooId: Long? = null
@ColumnInfo(name = "bar_id")
var barId: Long? = null
}
@Entity(tableName = "foo")
open class Foo(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
open val id: Long,
@ColumnInfo(name = "foo")
val foo: String?,
)
@Entity(tableName = "bar")
open class Bar(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
open val id: Long,
@ColumnInfo(name = "bar")
val bar: String?,
)
Я пытаюсь создать POJO объединения для хранения результатов запроса:
class FooBar(
@Embedded
val foo: Foo,
@Embedded
val bar: Bar
)
И моя неудачная попытка запроса:
@Query("SELECT foo.*, bar.* FROM foo, bar JOIN state ON foo.id == state.foo_id JOIN bar ON bar.id == session.bar_id ")
fun getFooBar(): LiveData<FooBar>
Однако при компиляции я получаю сообщение об ошибке. Нужно ли мне деконфликтировать поля идентификаторов в foo и bar, поскольку они называются одинаково?
Я пробовал с префиксом, не повезло:
class FooBar(
@Embedded(prefix = "foo_")
val foo: Foo,
@Embedded(prefix = "bar_")
val bar: Bar
)
Есть идеи?
Ответ №1:
Вот пример, который может вам помочь.
@Query("SELECT RoomArticle.*, RoomBranch.id AS 'RoomBranch_id', RoomBranch.name AS 'RoomBranch_name' "
Объект данных:
public class RoomArticleOfBranch {
@Embedded
public RoomArticle article;
@Embedded(prefix = "RoomBranch_")
public RoomBranch branch;
Обратите внимание, что я предоставляю префикс как в запросе, так и в @Embedded
.
Ответ №2:
При попытке встроить попробуйте изменить запрос следующим образом
@Dao
interface TestDao {
@Query("SELECT foo.id as foo_id,bar.id as bar_id,bar.bar as bar_bar FROM foo, bar JOIN state ON foo_id = state.foo_id and bar_id = state.bar_id")
fun getFooBar(): LiveData<FooBar>
}
Необходимо исправить две вещи.
-
Вам необходимо переименовать имя столбца во время запроса select.
-
исправление вашего запроса на объединение.