LINUX.ORG.RU

Что за собаки в Kotlin?

 


0

1

Сунулся я тут изучить kotlin. Поставил Android Studio, загрузил проект из примеров. В примере некоторые строки начинаются с @, и я никак не соображу что это такое:

@Dao
interface PlantDao {
    @Query("SELECT * FROM plants ORDER BY name")
    fun getPlants(): Flow<List<Plant>>

    @Query("SELECT * FROM plants WHERE growZoneNumber = :growZoneNumber ORDER BY name")
    fun getPlantsWithGrowZoneNumber(growZoneNumber: Int): Flow<List<Plant>>

    @Query("SELECT * FROM plants WHERE id = :plantId")
    fun getPlant(plantId: String): Flow<Plant>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertAll(plants: List<Plant>)
}

https://drive.google.com/file/d/11Ieuk6y5LJ4uoScVl5PR50IqyYUrxaHT/view?usp=sh...

Здесь @Dao, @Query, @Insert - что это за конструкции?

Ответ на: комментарий от victor79

Не думаю, что подскажу на счет GUI, но огромное число проектов сейчас начинаются на python и go. Как правило, web и различные микросервисы. При этом, я не мобильный разработчик, но и там, на сколько я знаю не все прутся от java

in_dance
()
Ответ на: комментарий от in_dance

Java & Kotlin можно считать одной совместной системой знаний, там в проекте половина импортов на джаве. Я уже смирился, что и джаву придется знать. Но вот веб и мобилки это более независимые направления. И у меня от взгляда на HH сложилось впечатление, что если начинать учить новое, то лучше осваивать kotlin.

victor79
() автор топика
Ответ на: комментарий от Oberstserj

Ой нет. Надо java хоть поверхностно знать и для котлина и для скалы, иначе боль.

peregrine ★★★★★
()
Ответ на: комментарий от victor79

А что это такое?

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

peregrine ★★★★★
()
Ответ на: комментарий от Oberstserj

Для самостоятельного языка, который признал аж сам гугл и рекомендует его к использованию в новых проектах

А может они так троллят индусов, почем знать. Пока толпа набегает в котлин, серьезные люди спокойно продолжают писать на жаве. Потом договорятся с оракулом и скажут: ой, извините, котлин не торт. И вся толпа побежит портировать взад.

bread
()
Ответ на: комментарий от peregrine

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

Если уж задавать вопрос про СУБД, то он будет такой: в проекте, это демонстрационный пример 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
() автор топика
Последнее исправление: victor79 (всего исправлений: 2)
Ответ на: комментарий от anonymous

Я спрашиваю у тех, кому нравится отвечать. Кому то нравится спрашивать, кому то нравится отвечать, а кому то называть других буратинами.

victor79
() автор топика
Ответ на: комментарий от anonymous

Но в самой то аннотации ничего нет:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Entity {

там объявлены заполняемые поля, но не понятно, через какой обработчик это проходит. Какая то функция считывает значения аннотаций и преобразует в код. Вряд ли это в gradle.

Ссылается все это на Dao, описание есть в инете. Но как json попадает в проект, как mxl прилинковывается? Все подряд? Тогда бы json не знал в которую структуру помещаться. И тогда для примера, почему json должен быть в CREATE TABLE, mxl нет?

victor79
() автор топика
Последнее исправление: victor79 (всего исправлений: 1)
Ответ на: комментарий от victor79

А вот, нашел. Кривые ручки, не проспавшиеся мозги. И плюс, как где то написано, что нужно кошке все рассказать, и сразу станет все понятно.

const val PLANT_DATA_FILENAME = "plants.json"

victor79
() автор топика
Ответ на: комментарий от bread

Может и так. Во всяком случае сам Бреслав, уже давно забил болт на котлин (по его же признанию) и нигде его не использует. А вообще умиляет сам подход: писать под ограниченную систему на ограниченном числе языков и то через прослойку в виде JVM. Оно даже звучит как говно.

Oberstserj ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.