Die Implementierung für xx.xxDatabase konnte nicht gefunden werden. xxDatabase_Impl verwendet das Room-Framework in Android, um auf die Datenbankfehlerlösung zuzugreifen

Kürzlich habe ich bei der Entwicklung einer Android-App das Room-Framework verwendet, um auf die Datenbank zuzugreifen. Beim Kompilieren des Codes ist ein seltsamer Fehler aufgetreten: Die Implementierung für xx.xxDatabase.xxDatabase_Impl konnte nicht gefunden werden.

Diese Fehlermeldung weist darauf hin, dass Room die Implementierung von xxDatabase_Impl nicht finden kann. Allerdings gibt es in meinem Code tatsächlich eine Definition der Klasse xxDatabase_Impl, warum passiert das?

Nach sorgfältiger Untersuchung habe ich das Problem gefunden: Als ich das Room-Framework verwendet habe, habe ich den Annotation-Prozessor nicht richtig gemäß der Spezifikation eingestellt. Nachdem wir das Room-Framework über Gradle eingeführt haben, müssen wir den Anmerkungsprozessor in der Datei build.gradle des Moduls konfigurieren. Andernfalls kann das Room-Framework den von uns geschriebenen Code nicht korrekt verarbeiten und der obige Fehler tritt auf.

Konkret müssen wir den folgenden Code zur build.gradle-Datei des Moduls hinzufügen:

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

Unter anderem gibt room.schemaLocation den Speicherort des Schemas an. Hier speichere ich die Schemadatei im Ordner „schemas“ des Projektstammverzeichnisses.

Als nächstes müssen wir der von uns definierten Datenbankklasse entsprechende Anmerkungen hinzufügen, um anzugeben, dass es sich um eine Room-Datenbank handelt, und die entsprechenden Entitäten und Versionsinformationen angeben:

@Database(entities = {User.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
    ...
}

Nachdem wir diese Einstellungen vorgenommen haben, kompilieren wir den Code erneut und der Fehler „Implementierung für xx.xxDatabase.xxDatabase_Impl konnte nicht gefunden werden“ wird nicht angezeigt.

Wenn wir beim Schreiben von Code außerdem andere Annotationen (z. B. @Dao, @Entity usw.) verwenden müssen, müssen wir den Annotationsprozessor auch auf die Datei build.gradle festlegen, andernfalls ähnelt dies einem Fehler.

Zusammenfassend lässt sich sagen, dass der Grund für den oben genannten Fehler hauptsächlich darin liegt, dass der Anmerkungsprozessor des Room-Frameworks nicht richtig eingestellt ist. Die Lösung besteht darin, den Annotationsprozessor in der Datei build.gradle des Moduls zu konfigurieren und die erforderlichen Annotationen zu den entsprechenden Klassen hinzuzufügen. Der endgültige Code sieht so aus:

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

@Database(entities = {User.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
    ...
}

Abgesehen von der ordnungsgemäßen Einrichtung von Annotationsprozessoren in Ihrem Code gibt es noch andere Dinge, die dazu führen können, dass dieser Fehler auftritt.

Bei Verwendung des Room-Frameworks müssen wir die entsprechende Bibliothek in der Datei build.gradle einführen. Normalerweise fügen wir Abhängigkeiten den folgenden Code hinzu:

dependencies {
    ...
    implementation 'androidx.room:room-runtime:2.3.0'
    annotationProcessor 'androidx.room:room-compiler:2.3.0'
}

Hier gibt androidx.room:room-runtime die Laufzeitbibliothek des Room-Frameworks an, und annotationProcessor 'androidx.room:room-compiler gibt den Annotation-Prozessor des Room-Frameworks an.

Wenn wir vergessen, diese Abhängigkeiten beim Schreiben von Code hinzuzufügen, wird auch der Fehler „Implementierung für xx.xxDatabase.xxDatabase_Impl konnte nicht gefunden werden“ angezeigt. Daher müssen Sie bei Verwendung des Room-Frameworks zusätzlich zum Festlegen des Annotationsprozessors im Code auch auf die Einführung der entsprechenden Bibliothek achten.

Wenn wir beim Schreiben des Codes außerdem die Entitäten oder Versionsnummern der Datenbank ändern, den Code des Room-Frameworks jedoch nicht neu generieren, tritt dieser Fehler ebenfalls auf. Die Lösung besteht darin, die Aufgabe hinzuzufügen, den vom Room-Framework generierten Code im Build zu löschen und den Code neu zu kompilieren:

android {
    ...
    compileOptions {
        ...
        // 生成Java 8代码
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    def room_version = "2.3.0"

    dependencies {
        ...
        // Room框架库
        implementation "androidx.room:room-runtime:$room_version"
        annotationProcessor "androidx.room:room-compiler:$room_version"

        ...

        // 清除Room框架生成的代码
        task cleanRoom(type: Delete) {
            delete rootProject.buildDir.path + "/generated"
        }

        preBuild.dependsOn(cleanRoom)
        clean.dependsOn(cleanRoom)
    }
}

preBuild.dependsOn(cleanRoom) und clean.dependsOn(cleanRoom) geben hier an, dass vor dem Kompilieren oder Löschen des Codes die CleanRoom-Aufgabe ausgeführt werden muss, d. h. der vom Room-Framework generierte Code sollte gelöscht werden. Dadurch wird sichergestellt, dass der Code des Room-Frameworks immer mit der von uns definierten Entitätsklasse und Versionsnummer übereinstimmt.

Zusammenfassend lässt sich sagen, dass Sie neben der korrekten Einstellung des Anmerkungsprozessors im Code auch auf die Bibliothek achten müssen, die das Room-Framework einführt, und regelmäßig den vom Room-Framework generierten Code löschen, um die Richtigkeit des Codes sicherzustellen. Ich hoffe, dass diese Freigabe für Sie hilfreich ist, wenn Sie auf den Fehler stoßen, dass die Implementierung für xx.xxDatabase.xxDatabase_Impl nicht gefunden werden konnte.

Guess you like

Origin blog.csdn.net/liuqingup/article/details/131327058