Коллекция не содержит элементов, соответствующих предикату - PullRequest
3 голосов
/ 13 января 2020

Я использую библиотеку Room и получаю следующее сообщение об ошибке при попытке создать приложение:

e: [kapt] An exception occurred: java.util.NoSuchElementException: Collection contains no element matching the predicate.

Вот более подробное сообщение об ошибке:

FAILURE: Build failed with an exception
* What went wrong:
Execution failed for task ':app:kaptDebugKotlin'.
> Compilation error. See log for more details

Я выделил проблему в коде следующим образом, хотя я не знаю, что именно вызывает это исключение:

package com.example.pomoplay

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

@Database(entities = [(Category::class)], version = 1)
abstract class PomoPlayDatabase: RoomDatabase() {

    abstract fun categoryDao(): CategoryDao

    companion object {
        private var INSTANCE: PomoPlayDatabase? = null
        internal fun getDatabase(context: Context): PomoPlayDatabase?
        {
            if (INSTANCE == null) {
                synchronized(PomoPlayDatabase::class.java) {
                    if (INSTANCE == null) {
                        INSTANCE =
                            Room.databaseBuilder<PomoPlayDatabase>(
                                context.applicationContext,
                                PomoPlayDatabase::class.java,
                                "pomoplay_database").build()
                    }
                }
            }
            return INSTANCE
        }
    }
}

Gradle.build - проект

    buildscript {
        ext.kotlin_version = '1.3.61'
        repositories {
            google()
            jcenter()

        }
        dependencies {


            classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0'
            classpath 'com.android.tools.build:gradle:3.5.3'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }

    allprojects {
        repositories {
            google()
            jcenter()

        }
    }

    task clean(type: Delete) {
        delete rootProject.buildDir
    }

Gradle.build - модуль

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: "androidx.navigation.safeargs.kotlin"

apply plugin: 'kotlin-kapt'

android {

    packagingOptions {
        exclude 'META-INF/atomicfu.kotlin_module'
    }

    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.example.pomoplay"
        minSdkVersion 23
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0'
    implementation 'androidx.navigation:navigation-ui-ktx:2.1.0'

    //Room Components
    implementation "androidx.room:room-runtime:2.2.3"
    kapt "androidx.room:room-compiler:2.2.3"

    //Testing Components
    testImplementation 'junit:junit:4.13'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Нет необходимости создавать отдельный класс данных. Просто убедитесь, что он Serializable

Потратив день на эту ошибку, я определил, что проблема заключается в наличии пустого конструктора в классе @Entity.

constructor() {}

Это не так всегда этот конструктор должен отсутствовать. У меня есть другой класс @Entity, где он очень нужен, иначе он не работает с этой ошибкой

Entities and POJOs must have a usable public constructor. 
You can have an empty constructor or a constructor whose parameters match the fields (by name and type).
public final class Question implements java.io.Serializable

Не понял причины, стоящие за ним, но это должен быть способ нашего использования. Это не должно означать Android Studio должен go молчать в строке Номер ошибки компиляции. Это было похоже на ловушку для мыши

0 голосов
/ 13 января 2020

Я нашел ответ на свой вопрос. Я вынул все файлы в проекте, а затем вставил обратно по одному файлу за раз и изолировал проблему от файла класса базы данных комнаты, который я упомянул выше в своем первоначальном вопросе. Я подумал, что, возможно, атрибут Category::class в массиве аннотации @Database что-то не так.

Я посмотрел, как я создал класс Category, и сравнил его с тем, как классы сущностей создаются в других android проектах комнат, размещенных в inte rnet. Оказывается, что эти другие проекты используют класс данных для сущностей, тогда как я использовал обычную структуру стиля POCO. Вместо этого я реализовал класс данных, и теперь все работает.

Класс данных категории:

import androidx.annotation.NonNull
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "categories_table")
data class Category(@PrimaryKey(autoGenerate = true) @NonNull @ColumnInfo(name = "categoryId") val id: Int, @ColumnInfo(name = "categoryName") val name: String, @ColumnInfo(name = "categoryDesc") val desc: String)
...