LINUX.ORG.RU

История изменений

Исправление victor79, (текущая версия) :

Очень важная штука, для работы с реляционными СУБД. Язык такой запросов. Без него в куче серьёзных проектов делать нечего.

Если уж задавать вопрос про СУБД, то он будет такой: в проекте, это демонстрационный пример Sunflower, есть файл plants.json, который содержит таблицу. И с этой таблицей после работается запросом из аннотации:

 @Query("SELECT * FROM plants WHERE growZoneNumber = :growZoneNumber ORDER BY name")

Так же там есть подобные запросы к таблицам, которые не идут из json:

@Query("SELECT * FROM garden_plantings")

вероятно первая таблица инициализируется строками:

@Entity(tableName = "plants")
data class Plant(
    @PrimaryKey @ColumnInfo(name = "id") val plantId: String,
    val name: String,
    val description: String,
    val growZoneNumber: Int,
    val wateringInterval: Int = 7, // how often the plant should be watered, in days
    val imageUrl: String = ""
) {

    /**
     * Determines if the plant should be watered.  Returns true if [since]'s date > date of last
     * watering + watering Interval; false otherwise.
     */
    fun shouldBeWatered(since: Calendar, lastWateringDate: Calendar) =
        since > lastWateringDate.apply { add(DAY_OF_YEAR, wateringInterval) }

    override fun toString() = name
}

Вторая:

@Entity(
    tableName = "garden_plantings",
    foreignKeys = [
        ForeignKey(entity = Plant::class, parentColumns = ["id"], childColumns = ["plant_id"])
    ],
    indices = [Index("plant_id")]
)
data class GardenPlanting(
    @ColumnInfo(name = "plant_id") val plantId: String,

    /**
     * Indicates when the [Plant] was planted. Used for showing notification when it's time
     * to harvest the plant.
     */
    @ColumnInfo(name = "plant_date") val plantDate: Calendar = Calendar.getInstance(),

    /**
     * Indicates when the [Plant] was last watered. Used for showing notification when it's
     * time to water the plant.
     */
    @ColumnInfo(name = "last_watering_date")
    val lastWateringDate: Calendar = Calendar.getInstance()
) {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    var gardenPlantingId: Long = 0
}

Обе таблицы создаются CREATE TABLE в герерационной части проета.

Так вот вопрос, каким образом дается указание компоновщику, что файл plants.json должен преобразоваться в таблицу? Где указание того, что одна таблица это plants.json, а другая просто пустая таблица? И какими строками говорится компоновщику, что для таблиц нужно сделать CREATE TABLE?

Можно конечно проверить, в пустом проекте подключить import androidx.room.Entity и после написать @Entity(...), но я сомневаюсь что из этого получится CREATE TABLE.

Я изрядно посидел в Qt, так там есть файл pro, в котором перечисляются все файлы проекта и способ их подключения. А здесь не понятно, как компоновщик отличает файлы проекта от прочих.

Исправление victor79, :

Очень важная штука, для работы с реляционными СУБД. Язык такой запросов. Без него в куче серьёзных проектов делать нечего.

Если уж задавать вопрос про СУБД, то он будет такой: в проекте, это демонстрационный пример Sunflower, есть файл plants.json, который содержит таблицу. И с этой таблицей после работается запросом из аннотации:

 @Query("SELECT * FROM plants WHERE growZoneNumber = :growZoneNumber ORDER BY name")

Так же там есть подобные запросы к таблицам, которые не идут из json:

@Query("SELECT * FROM garden_plantings")

вероятно первая таблица инициализируется строками:

@Entity(tableName = "plants")
data class Plant(
    @PrimaryKey @ColumnInfo(name = "id") val plantId: String,
    val name: String,
    val description: String,
    val growZoneNumber: Int,
    val wateringInterval: Int = 7, // how often the plant should be watered, in days
    val imageUrl: String = ""
) {

    /**
     * Determines if the plant should be watered.  Returns true if [since]'s date > date of last
     * watering + watering Interval; false otherwise.
     */
    fun shouldBeWatered(since: Calendar, lastWateringDate: Calendar) =
        since > lastWateringDate.apply { add(DAY_OF_YEAR, wateringInterval) }

    override fun toString() = name
}

Вторая:

@Entity(
    tableName = "garden_plantings",
    foreignKeys = [
        ForeignKey(entity = Plant::class, parentColumns = ["id"], childColumns = ["plant_id"])
    ],
    indices = [Index("plant_id")]
)
data class GardenPlanting(
    @ColumnInfo(name = "plant_id") val plantId: String,

    /**
     * Indicates when the [Plant] was planted. Used for showing notification when it's time
     * to harvest the plant.
     */
    @ColumnInfo(name = "plant_date") val plantDate: Calendar = Calendar.getInstance(),

    /**
     * Indicates when the [Plant] was last watered. Used for showing notification when it's
     * time to water the plant.
     */
    @ColumnInfo(name = "last_watering_date")
    val lastWateringDate: Calendar = Calendar.getInstance()
) {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    var gardenPlantingId: Long = 0
}

Обе таблицы создаются CREATE TABLE в герерационной части проета.

Так вот вопрос, каким образом дается указание компоновщику, что файл plants.json должен преобразоваться в таблицу? Где указание того, что одна таблица это plants.json, а другая просто пустая таблица? И какими строками говорится компоновщику, что для таблиц нужно сделать CREATE TABLE?

Можно конечно проверить, в пустом проекте подключить import androidx.room.Entity и после написать @Entity(...), но я сомневаюсь что из этого получится CREATE TABLE.

Я изрядно посидел в Qt, так там есть файл pro, в котором перечисляются все файлы проекта и способ их подключения.

Исходная версия victor79, :

Очень важная штука, для работы с реляционными СУБД. Язык такой запросов. Без него в куче серьёзных проектов делать нечего.

Если уж задавать вопрос про СУБД, то он будет такой: в проекте, это демонстрационный пример Sunflower, есть файл plants.json, который содержит таблицу. И с этой таблицей после работается запросом из аннотации:

 @Query("SELECT * FROM plants WHERE growZoneNumber = :growZoneNumber ORDER BY name")

Так же там есть подобные запросы к таблицам, которые не идут из json:

@Query("SELECT * FROM garden_plantings")

вероятно первая таблица инициализируется строками:

@Entity(tableName = "plants")
data class Plant(
    @PrimaryKey @ColumnInfo(name = "id") val plantId: String,
    val name: String,
    val description: String,
    val growZoneNumber: Int,
    val wateringInterval: Int = 7, // how often the plant should be watered, in days
    val imageUrl: String = ""
) {

    /**
     * Determines if the plant should be watered.  Returns true if [since]'s date > date of last
     * watering + watering Interval; false otherwise.
     */
    fun shouldBeWatered(since: Calendar, lastWateringDate: Calendar) =
        since > lastWateringDate.apply { add(DAY_OF_YEAR, wateringInterval) }

    override fun toString() = name
}

Вторая:

@Entity(
    tableName = "garden_plantings",
    foreignKeys = [
        ForeignKey(entity = Plant::class, parentColumns = ["id"], childColumns = ["plant_id"])
    ],
    indices = [Index("plant_id")]
)
data class GardenPlanting(
    @ColumnInfo(name = "plant_id") val plantId: String,

    /**
     * Indicates when the [Plant] was planted. Used for showing notification when it's time
     * to harvest the plant.
     */
    @ColumnInfo(name = "plant_date") val plantDate: Calendar = Calendar.getInstance(),

    /**
     * Indicates when the [Plant] was last watered. Used for showing notification when it's
     * time to water the plant.
     */
    @ColumnInfo(name = "last_watering_date")
    val lastWateringDate: Calendar = Calendar.getInstance()
) {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    var gardenPlantingId: Long = 0
}

Обе таблицы создаются CREATE TABLE в герерационной части проета.

Так вот вопрос, каким образом дается указание компоновщику, что файл plants.json должен преобразоваться в таблицу? Где указание того, что одна таблица это plants.json, а другая просто пустая таблица? И какими строками говорится компоновщику, что для таблиц нужно сделать CREATE TABLE?

Можно конечно проверить, в пустом проекте подключить import androidx.room.Entity и после написать @Entity(...), но я сомневаюсь что из этого получится CREATE TABLE.