База данных комнат: ошибки преобразования курсоров в WorkoutDao для запросов и вставок с помощью сопрограмм Kotlin — неоAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 База данных комнат: ошибки преобразования курсоров в WorkoutDao для запросов и вставок с помощью сопрограмм Kotlin — нео

Сообщение Anonymous »

Я разрабатываю фитнес-приложение, используя Android Studio и Room в качестве базы данных. У меня возникают проблемы с запросами и вставками Room в мой WorkoutDao. В частности, я вижу ошибки, связанные с обработкой курсоров и продолжений. Несмотря на следующую документацию Room и несколько руководств, я не могу решить эти проблемы.
Сообщения об ошибках:
Ошибка: «Не знаю, как преобразовать курсор в возвращаемый результат этого метода». type (java.lang.Object)"
Происходит при следующих запросах:
getExercisionsForWorkout
getSetsForExercision
Ошибка: «Тип параметра должен быть класс, аннотированный @Entity или его коллекцию/массив."
Неиспользуемый параметр: $completion в запросах.

Код: Выделить всё

package com.example.teampotentialfitness

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import kotlinx.coroutines.flow.Flow

@Dao
interface WorkoutDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertWorkout(workout: Workout): Long

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertExercise(exercise: Exercise): Long

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertSet(set: Set): Long

@Query("SELECT * FROM exercise_table WHERE workoutId = :workoutId")
fun getExercisesForWorkout(workoutId: Int): Flow

@Query("SELECT * FROM set_table WHERE exerciseId = :exerciseId")
fun getSetsForExercise(exerciseId: Int): Flow
}

Код: Выделить всё

package com.example.teampotentialfitness

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = [Exercise::class, Workout::class, Set::class], version = 1)
abstract class WorkoutDatabase : RoomDatabase() {

abstract fun workoutDao(): WorkoutDao

companion object {
@Volatile
private var INSTANCE: WorkoutDatabase? = null

fun getDatabase(context: Context): WorkoutDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
WorkoutDatabase::class.java,
"workout_database"
).build()
INSTANCE = instance
instance
}
}
}
}

Код: Выделить всё

package com.example.teampotentialfitness

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "exercise_table")
data class Exercise(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,

val name: String,
val workoutId: Int
)

Код: Выделить всё

package com.example.teampotentialfitness

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "workout_table")
data class Workout(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,

val workoutName: String
)

Код: Выделить всё

package com.example.teampotentialfitness

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "set_table")
data class Set(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,

val reps: Int,
val weight: Float,
val exerciseId: Int
)

Код: Выделить всё

package com.example.teampotentialfitness

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.teampotentialfitness.ui.theme.TeamPotentialFitnessTheme

class MainActivity : ComponentActivity() {
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
TeamPotentialFitnessTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(name = "Team Potential Fitness", modifier = Modifier.padding(innerPadding))
}
}
}
}
}

@Composable
fun Greeting(name: String, modifier:  Modifier = Modifier) {
Text(text = "Welcome to $name!", modifier = modifier)
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
TeamPotentialFitnessTheme {
Greeting("Team Potential Fitness")
}
}

Код: Выделить всё

plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
}

android {
compileSdk 34

defaultConfig {
applicationId "com.example.teampotentialfitness"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0"

javaCompileOptions {
annotationProcessorOptions {
arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}

buildFeatures {
compose true
}

composeOptions {
kotlinCompilerExtensionVersion "1.5.1"
}

kotlinOptions {
jvmTarget = '17'
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}

dependencies {
implementation "androidx.compose.ui:ui:1.5.0"
implementation "androidx.compose.material3:material3:1.1.0"
implementation "androidx.lifecycle:lifecycle-runtime-compose:2.6.1"
implementation "androidx.room:room-runtime:2.5.2"
kapt "androidx.room:room-compiler:2.5.2"
implementation "androidx.room:room-ktx:2.5.2"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1"
implementation "androidx.activity:activity-compose:1.7.2"
testImplementation "junit:junit:4.13.2"
androidTestImplementation "androidx.test.ext:junit:1.1.5"
androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1"
debugImplementation "androidx.compose.ui:ui-tooling:1.5.0"
debugImplementation "androidx.compose.ui:ui-test-manifest:1.5.0"
}

**Я попробовал несколько решений, таких как изменение сигнатур методов, настройка запросов к базе данных и настройка конфигураций сборки, но проблема не устранена.
Кто-нибудь сталкивался с подобными проблемами или может предложить решение для решения этих проблем с базой данных комнат?
Заранее спасибо!**
Я занимаюсь разработкой фитнес-приложение, использующее Kotlin и Android Studio, интегрирующее базу данных комнат для управления объектами «Тренировка», «Упражнения» и «Набор». Проблема возникает при выполнении запросов Room или операций вставки через сопрограммы Kotlin в классе WorkoutDao. В частности, я получаю ошибки «Не знаю, как преобразовать курсор» и «Неиспользуемый параметр» при запросе к базе данных или попытке вставки данных.
Я ожидал, что запросы и вставки будут работать гладко, учитывая, что я следую лучшим практикам сопрограмм Room и Kotlin, но эти ошибки сохраняются. Я пробовал:
Исправить типы данных в запросах и вставках.
Проверить правильность аннотаций объектов.
Обеспечить правильное использование сопрограмм с функциями приостановки в WorkoutDao.
Выполнение FallbackToDestructiveMigration() в построителе базы данных.
Проверка, не вызывают ли возвращаемые типы WorkoutDao проблемы с чтением и преобразованием данных базой данных.
Несмотря на эти попытки, ошибки продолжаются. Ниже приведен соответствующий код для справки.

Подробнее здесь: https://stackoverflow.com/questions/790 ... insertions
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»