如何将项目添加到房间数据库? [已关闭]

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

由于某种原因,我无法将项目添加到房间数据库中,我的 Daos 的其余部分工作正常,但似乎 @Upsert 不行(显然我在某个地方搞砸了)。我使用“应用程序检查”中的查询向其中添加元素,并连续查看添加的内容,从而清楚地看出问题所在。

该应用程序是一个简单的应用程序,用于存储记住的经文。我们将非常感谢您的帮助。

道斯

interface DaoFunctions {

    @Upsert
    suspend fun addVerse(verse: Verse)


    @Query("SELECT * FROM MyVersesTable ORDER BY bookPosition ASC")
    fun getVerseByBook(): PagingSource<Int,Verse>

    @Query("SELECT * FROM MyVersesTable ORDER BY themeName ASC")
    fun getVersesByTheme(): PagingSource<Int,Verse>

    @Query("SELECT * FROM MyVersesTable ORDER BY date ASC")
    fun getVersesByDate(): PagingSource<Int,Verse>

    @Query("SELECT * FROM MyVersesTable")
    fun getVersesByDateFlow(): List<Verse>

    @Delete
     fun deletVerse(verse: Verse)




} 

存储库接口

interface DataBaseRepository {


    suspend fun addVerse(verse: Verse)

    fun getVerseByBook(): PagingSource<Int, Verse>

    fun getVersesByTheme(): PagingSource<Int,Verse>

    fun getVersesByDate(): PagingSource<Int,Verse>

    fun deletVerse(verse: Verse)

    fun getVersesByDateFlow(): List<Verse>

}  

存储库已实施


class DataBaseRepositoryImpl @Inject constructor( val daos: DaoFunctions): DataBaseRepository{

    override suspend fun addVerse(verse: Verse)  = daos.addVerse(verse)

    override fun getVerseByBook() = daos.getVerseByBook()


    override fun getVersesByTheme() = daos.getVersesByTheme()

    override fun getVersesByDate() = daos.getVersesByDate()

    override fun deletVerse(verse: Verse) = daos.deletVerse(verse)

    override fun getVersesByDateFlow() = daos.getVersesByDateFlow()




}

桌子


@Entity(tableName = "MyVersesTable")
data class Verse(

    val verse: String,
    val bookName: String,
    val chapterAndVerseNumber: String,

    val bookPosition: Byte,
    val date: Long,


    val themeName: String,

    val photoFilePath: String,




    @PrimaryKey(autoGenerate = true)
    val id: Int = 0
)

添加 Verse 视图模型


@HiltViewModel
class AddingVerseScreenViewModel @Inject constructor(

    private val daoFunctions: DataBaseRepositoryImpl

): ViewModel() {





    private val _state = MutableStateFlow(AddingVerseScreenStates())
    val state = _state.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), AddingVerseScreenStates())


    private val eventsChannel = Channel<AddingVerseScreenEvents>()
    val eventFlow =  eventsChannel.receiveAsFlow()


    fun triggerSaveVerseEvent(){

        viewModelScope.launch {

            eventsChannel.send(AddingVerseScreenEvents.saveVerse)

        }

    }


    fun triggerShowingPopUpMenuEvent(){

        viewModelScope.launch {

            eventsChannel.send(AddingVerseScreenEvents.showPopUpMenu)

        }

    }





    fun triggerHidingPopUpMenuEvent(){

        viewModelScope.launch {

            eventsChannel.send(AddingVerseScreenEvents.hidePopUpMenu)

        }

    }







    fun saveVerse() {

//        if (_state.value.bookName.isBlank() || _state.value.verse.isBlank() || _state.value.themeName.isBlank() || _state.value.photoFilePath.isBlank() || _state.value.note.isBlank())
//            return


        val verse =  Verse(
            bookName = _state.value.bookName,
            chapterAndVerseNumber = _state.value.chapter + ":" + _state.value.verseNumber,
            verse = _state.value.verse,
            date = System.currentTimeMillis(),
            themeName = _state.value.themeName,
            bookPosition = _state.value.bookPosition,
            photoFilePath = _state.value.photoFilePath,


        ) // VERSE ENDS

        viewModelScope.launch {


            daoFunctions.addVerse(verse)

        } // SCOPE ENDS


//        _state.update {
//
//            it.copy(
//
//                bookName = "",
//                chapterAndVerseNumber = "",
//                verse = "",
//                bookPosition = 0,
//
//                note = "",
//
//                themeName = "",
//                themeColour = "",
//
//                photoFilePath = "",
//
//            ) // COPY ENDS
//
//        } // UPDATE ENDS





    }







    fun showPopUpMenu(){


        _state.update { it.copy(showingPopupMenu = true) }


    }

    fun hidePopUpMenu(){


        _state.update {    it.copy(showingPopupMenu = false)    }


    }



    fun setBookName(book: String){

        _state.update {    it.copy(bookName = book)     }


    }



    fun showBookSelectionDialog(){

        _state.update {    it.copy(isBookSelectionDialogShowing = true)     }
    }





    fun hideBookSelectionDialog(){

        _state.update {    it.copy(isBookSelectionDialogShowing = false)     }
    }







    fun showChapterSelectionDialog(){

        _state.update {    it.copy(isChapterSelectionDialogShowing = true)     }
    }





    fun hideChapterSelectionDialog(){

        _state.update {    it.copy(isChapterSelectionDialogShowing = false)     }
    }




    fun showVerseSelectionDialog(){

        _state.update {    it.copy(isVerseSelectionDialogShowing = true)     }
    }





    fun hideVerseSelectionDialog(){

        _state.update {    it.copy(isVerseSelectionDialogShowing = false)     }
    }






    fun setChapter(chapter: String){

        _state.update {    it.copy(chapter = chapter)     }

    }







    fun setVerseNumber(verseNumber: String){

        _state.update {    it.copy(verseNumber = verseNumber)     }

    }





    fun setVerse(verse: String){

        _state.update {    it.copy(verse = verse)     }

    }


    fun setNote(note: String){

        _state.update {    it.copy(note = note)     }
    }


    fun setThemeName(themeName: String){

        _state.update {    it.copy(themeName = themeName)     }

    }


    fun setThemeColour(colour: String){

        _state.update {    it.copy(themeColour = colour)     }

    }


    fun setPhotoFilePath(path: String){

        _state.update {    it.copy(photoFilePath = path)     }

    }



    fun setConditionForThemeExistence(condition: Boolean){

        _state.update {    it.copy(doesThemeExist = condition)     }
    }


















}

主屏幕视图模型

@HiltViewModel
class HomeScreenViewModel @Inject constructor(

    val daoFunctions: DataBaseRepositoryImpl

): ViewModel() {




  private val _state = MutableStateFlow(HomeScreenStates())


  val state = _state.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), HomeScreenStates())


    val allVerses = Pager(

     config = PagingConfig(

         pageSize = 60,
         enablePlaceholders = true,
         maxSize = 200

     ) // PAGING CONFIG ENDS
 ) {

//      when(_state.value.sortType){
//
//          SortType.byBook -> daoFunctions.getVerseByBook()
//          SortType.byDate -> daoFunctions.getVersesByDate()
//          SortType.byTheme -> daoFunctions.getVersesByTheme()
//      }



            daoFunctions.getVersesByDate()



 }// PAGER ENDS


    private val eventsChannel = Channel<HomeScreenEvents>()
    val eventFlow = eventsChannel.receiveAsFlow()


    fun triggerShowingPopUpMenuEvent(){

         viewModelScope.launch {

             eventsChannel.send(HomeScreenEvents.showPopUpMenu)

         }

    }





    fun triggerHidingPopUpMenuEvent(){

        viewModelScope.launch {

            eventsChannel.send(HomeScreenEvents.hidePopUpMenu)

        }

    }






    fun triggerShowingMenuSideBarEvent(){

        viewModelScope.launch {

            eventsChannel.send(HomeScreenEvents.showMenuSideBar)

        }

    }





    fun triggerHidingMenuSideBarEvent(){

        viewModelScope.launch {

            eventsChannel.send(HomeScreenEvents.hideMenuSideBar)

        }

    }






    fun triggerExpandingSearchBarEvent(){

        viewModelScope.launch {

            eventsChannel.send(HomeScreenEvents.expandSearchBar)

        }

    }





    fun triggerCollapsingSearchBarEvent(){

        viewModelScope.launch {

            eventsChannel.send(HomeScreenEvents.collapseSearchBar)

        }

    }







    fun triggerShowingAddVerseFloatingButton(){

        viewModelScope.launch {

            eventsChannel.send(HomeScreenEvents.showAddingVerseFloatingButton)

        }

    }





    fun triggerHidingAddVerseFloatingButton(){

        viewModelScope.launch {

            eventsChannel.send(HomeScreenEvents.showAddingVerseFloatingButton)

        }

    }






    fun triggerChangingSortTypeEvent(sortType: SortType){

        viewModelScope.launch {

            eventsChannel.send(HomeScreenEvents.changeSortTypeOfVersesTo(sortType))

        }


    }






















     fun showPopUpMenu(){


        _state.update { it.copy(showingPopupMenu = true) }


    }

    fun hidePopUpMenu(){


        _state.update {    it.copy(showingPopupMenu = false)    }


    }


    fun showMenuSideBar(){

        _state.update {     it.copy(showingMenuSideBar = false)    }

    }


    fun hideMenuSideBar(){

        _state.update {     it.copy(showingMenuSideBar = false)     }

    }


    fun expandSearchBar(){

        _state.update {      it.copy(expandedSearchBar = true)     }

    }


    fun collapseSearchBar(){

        _state.update {      it.copy(expandedSearchBar = false)     }

    }



    fun showAddingVerseFloatingButton(){

        _state.update {      it.copy(showingAddingVerseFloatingButton = true)     }

    }

    fun hideAddingVerseFloatingButton(){

        _state.update {      it.copy(showingAddingVerseFloatingButton = false)     }

    }



    fun changeSortTypeOfVersesTo(sortType: SortType){


        _state.update {      it.copy(sortType =  sortType)     }

    }


    fun updateUiThemeTo(theme: String){


        _state.update {      it.copy(lastOpenedTheme = theme)     }

    }



}

Gradle 模块代码

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

apply plugin: 'com.android.application'
apply plugin: 'com.google.dagger.hilt.android'

android {
    namespace 'com.example.Sword'
    compileSdk 34

    defaultConfig {
        applicationId "com.example.Sword"
        minSdk 21
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'


    }
    buildFeatures {
        compose true
    }
    composeOptions {
        kotlinCompilerExtensionVersion '1.5.4'
    }
    packagingOptions {
        resources {
            excludes += '/META-INF/{AL2.0,LGPL2.1}'
        }
    }
}

dependencies {

    implementation 'androidx.core:core-ktx:1.8.0'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
    implementation 'androidx.activity:activity-compose:1.5.1'
    implementation platform('androidx.compose:compose-bom:2022.10.00')
    implementation 'androidx.compose.ui:ui'
    implementation 'androidx.compose.ui:ui-graphics'
    implementation 'androidx.compose.ui:ui-tooling-preview'
    implementation 'androidx.compose.material3:material3'
    implementation platform('androidx.compose:compose-bom:2023.03.00')
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
    androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
    androidTestImplementation platform('androidx.compose:compose-bom:2023.03.00')
    debugImplementation 'androidx.compose.ui:ui-tooling'
    debugImplementation 'androidx.compose.ui:ui-test-manifest'

    // ViewModel Compose
    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1"

     //FOR ROOM
    implementation "androidx.room:room-ktx:2.5.2"
    implementation("androidx.room:room-paging:2.5.2")
    kapt "androidx.room:room-compiler:2.5.2"


//    //Dagger - Hilt
//    implementation "com.google.dagger:daggerHilt-android:2.40.5"
//    kapt "com.google.dagger:daggerHilt-android-compiler:2.40.5"
//    implementation "androidx.daggerHilt:daggerHilt-lifecycle-viewmodel:1.0.0-alpha03"
//    kapt "androidx.daggerHilt:daggerHilt-compiler:1.0.0"
//    implementation 'androidx.daggerHilt:daggerHilt-navigation-compose:1.0.0'
//    //


    //HILT
    implementation 'com.google.dagger:hilt-android:2.49'
    kapt 'com.google.dagger:hilt-compiler:2.49'
    implementation 'androidx.fragment:fragment-ktx:1.6.2'


    // For instrumentation tests
    androidTestImplementation  'com.google.dagger:hilt-android-testing:2.49'
    kaptAndroidTest 'com.google.dagger:hilt-compiler:2.49'

    // For local unit tests
    testImplementation 'com.google.dagger:hilt-android-testing:2.49'
    kaptTest 'com.google.dagger:hilt-compiler:2.49'



    //PAGER
    def paging_version = "3.2.1"

    implementation "androidx.paging:paging-runtime:$paging_version"

    // alternatively - without Android dependencies for tests
    testImplementation "androidx.paging:paging-common:$paging_version"
    
    // optional - Jetpack Compose integration
    implementation "androidx.paging:paging-compose:3.3.0-alpha02"

    // collect as state with lifecycle
    implementation("androidx.lifecycle:lifecycle-runtime-compose:2.6.2")



}

hilt {
    enableAggregatingTask = false
}

kapt {
    correctErrorTypes true
}

Gradle 项目代码

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        // other repositories...
        mavenCentral()
    }
    dependencies {
        // other plugins...
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.49'
    }
}



plugins {

    id 'com.google.dagger.hilt.android' version '2.49' apply false
    id 'com.android.application' version '8.1.2' apply false
    id 'com.android.library' version '8.1.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.9.20' apply false

}

尝试了我能想到的一切,重写一切,仔细检查,一切。

我正在使用 daggerhilt,所以我怀疑 dao 对象不知何故被共享到我查看项目的屏幕,而不是共享到我添加项目的屏幕

android kotlin mvvm android-jetpack-compose android-room
1个回答
0
投票

我尝试了你的代码。 对此最好且快速的解决方案是。

  1. 更新了 Room 版本。

  2. 删除了 Dao 方法 addVerse 的返回类型 Unit 分配

结果

原因:我在 stackoverflow 和 reddit 上读到了一些关于它的帖子。 当我尝试删除 Dao 方法 addVerse 的返回类型 Unit 分配而不更新房间库时,我收到此错误。 参数的类型必须是@Entity注解的类或其集合/数组

我发现有一个未解决的问题: https://stackoverflow.com/a/73304737/7613626

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