Как правильно сделать запрос для SQLIte через библиотеку в котлине?

Рейтинг: 0Ответов: 0Опубликовано: 07.05.2023

У меня в бд имеются две сущности: Дни (айди(первичный ключ), день) и Упражнения (айди(внешний ключ), упражнение, айди_дня (внешний ключ)). В ресайклвью я закидываю карточки, которые заполняются инфой из бд и по которым я мог бы переходить.

Идея такова: пользователь вводит дату (инфа кидается в первую сущность, бд заполняется), создается карточка, юзер по ней переходит и таким же образом вводит название упражнения (инфа кидается во вторую сущность, через интент я передаю дату во внешний ключ, таблица заполняется тоже). Но в разные дни пользователь должен видеть упражнения, которые делались ИМЕННО В ЭТИ ДНИ (т.е. юзер не должен в первом дне видеть упражнения, которые он делал в другие). Для этого нужно (видимо) заполнять ресайклвью с помощью верного SQL-запроса и с этим есть проблема.

Создал аналог бд из котлина в DbBrowser:

SELECT Exercise_name, Exercise_day_id FROM Exercises
JOIN Days
ON Exercises.Exercise_day_id = Days.id
WHERE Exercises.Exercise_day_id = 2

Работает прекрасно и выводит то, что нужно. Но как это реализовать на котлине? Попытался в лоб переписать код из DbBrowser, но выдает ошибку "Нет такого атрибута как "day", доступные атрибуты "Exersice_name" и "Exercise_day_id", хотя Day у меня имеется. То бишь проблема в самом запросе, я явно тут накосячил, подскажите, пожалуйста, где:( Ну или если есть другой способ использовать запрос из DbBrowser и выводить в ресайклвью то, что мне нужно, был бы рад его увидеть или почитать о нем. Документацию осилить не в СиЛаХ...

fun readseveraldbdexercisedata(): ArrayList<ListItem>{
        val dataList = ArrayList<ListItem>()
        val selectQuery = "SELECT ${MyDbNameClass.EXERCISE_COLUMN_NAME_EXERCISE}, ${MyDbNameClass.EXERCISE_DAY_ID} FROM " +
                "${MyDbNameClass.EXERCISE_TABLE_NAME} " +
                "JOIN ${MyDbNameClass.DAYS_TABLE_NAME} ON  ${MyDbNameClass.EXERCISE_DAY_ID} = ${MyDbNameClass.DAYS_TABLE_NAME}.${BaseColumns._ID} " +
                "WHERE ${MyDbNameClass.EXERCISE_DAY_ID} = 1"
        val cursor = db?.rawQuery(selectQuery, null)
        while (cursor?.moveToNext()!!){
            val exerciseText = cursor.getString(cursor.getColumnIndexOrThrow(MyDbNameClass.DAYS_COLUMN_DAY))
            var item = ListItem()
            item.exercise_name = exerciseText
            dataList.add(item)
        }
        cursor.close()
        return dataList
    }

Если поможет, то вот код, в котором я объявляю БД:

//сущность ДНИ
    const val DAYS_TABLE_NAME = "Days"
    const val DAYS_COLUMN_DAY = "day"

    const val CREATE_TABLE_DAYS = "CREATE TABLE IF NOT EXISTS $DAYS_TABLE_NAME(" +
            "${BaseColumns._ID} INTEGER PRIMARY KEY, " +
            "$DAYS_COLUMN_DAY TEXT NOT NULL)"
    const val SQL_DELETE_DAYS_TABLE = "DROP TABLE IF EXISTS $DAYS_TABLE_NAME"

    //сущность УПРАЖНЕНИЯ
    const val EXERCISE_TABLE_NAME = "Exercises"
    const val EXERCISE_COLUMN_NAME_EXERCISE = "Exercise_name"
    const val EXERCISE_DAY_ID = "Exercise_day_id"

    const val CREATE_TABLE_EXERCISES = "CREATE TABLE IF NOT EXISTS $EXERCISE_TABLE_NAME(" +
            "${BaseColumns._ID} INTEGER PRIMARY KEY, $EXERCISE_COLUMN_NAME_EXERCISE TEXT NOT NULL DEFAULT 'Название упражнения'," +
            "Exercise_day_id TEXT NOT NULL DEFAULT 'Дата'," +
            "FOREIGN KEY('$EXERCISE_DAY_ID') REFERENCES 'Days')"
    const val SQL_DELETE_EXERCISES_TABLE = "DROP TABLE IF EXISTS $EXERCISE_TABLE_NAME"

Ответы

Ответов пока нет.