房间数据库:WorkoutDao 中使用 Kotlin 协程进行查询和插入时出现游标转换错误 - 需要帮助解决

问题描述 投票:0回答:1

我正在使用 Android Studio 开发一个健身应用程序,并以 Room 作为数据库。我在 WorkoutDao 中遇到 Room 查询和插入问题。具体来说,我看到与处理游标和延续相关的错误。尽管遵循 Room 文档和一些指南,我似乎无法解决这些问题。

错误信息: 错误:“不确定如何将 Cursor 转换为此方法的返回类型 (java.lang.Object)” 出现在以下查询中:

获取锻炼锻炼 获取锻炼组数 错误:“参数的类型必须是用 @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<List<Exercise>>

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

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"
}

**我尝试了多种解决方案,例如更改方法签名、调整数据库查询和调整构建配置,但问题仍然存在。

有人遇到过类似的问题或者可以提出解决方案来解决这些 Room 数据库问题吗?

提前致谢!**

我一直在使用 Kotlin 和 Android Studio 开发健身应用程序,集成 Room 数据库来管理 Workout、Exercise 和 Set 实体。通过 WorkoutDao 类中的 Kotlin 协程运行 Room 查询或插入操作时会出现此问题。具体来说,在查询数据库或尝试插入数据时,我收到“不确定如何转换游标”和“未使用的参数”错误。

鉴于我遵循 Room 和 Kotlin 协程最佳实践,我希望查询和插入能够顺利进行,但这些错误仍然存在。我试过了:

更正查询和插入中的数据类型。 验证实体是否已正确注释。 确保在 WorkoutDao 中正确使用具有挂起功能的协程。 在数据库构建器中运行fallbackToDestructiveMigration()。 检查 WorkoutDao 返回类型是否导致数据库读取和转换数据的方式出现问题。 尽管进行了这些尝试,错误仍然存在。下面是相关代码供参考。

android android-studio
1个回答
0
投票

此错误是由于实体名称

Set
!将实体类名称更改为其他名称,因为 Kotlin 中有一个名为
Set
的内置数据类型,它与您的实体名称冲突。

© www.soinside.com 2019 - 2024. All rights reserved.