Voici mon code

class BookmarkViewModel(app: Application) : AndroidViewModel(app) {

    private val dao = BookmarkDb.get(app).bookmarkDao()

    companion object {
        private const val PAGE_SIZE = PagingConstants.PERPAGE

        /**
         * If placeholders are enabled, PagedList will report the full size but some items might
         * be null in onBind method (PagedListAdapter triggers a rebind when data is loaded).
         * <p>
         * If placeholders are disabled, onBind will never receive null but as more pages are
         * loaded, the scrollbars will jitter as new pages are loaded. You should probably disable
         * scrollbars if you disable placeholders.
         */
        private const val ENABLE_PLACEHOLDERS = true
    }

        val allBookmarks = LivePagedListBuilder(dao.allBookmarkByDatetime(), PagedList.Config.Builder()
                    .setPageSize(PAGE_SIZE)
                    .setEnablePlaceholders(ENABLE_PLACEHOLDERS)
                    .build()).build()

    fun insert(title: String, description: String, datetime: String) = ioThread {
        dao.insert(Bookmark(id = 0, title = title, description = description, datetime = datetime))
    }

    fun remove(bookmark: Bookmark) = ioThread {
        dao.delete(bookmark)
    }
}

Cela provient des exemples Google. Après, je veux:

class BookmarkListFragment : FirstFragment() {

private var viewModel: BookmarkViewModel? = null
..

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        viewModel = ViewModelProviders.of(activity!!).get(BookmarkViewModel::class.java)
...

Et voici le problème:

java.lang.RuntimeException: impossible de créer une instance de la classe com.lacas.db.room.BookmarkViewModel

Puis-je utiliser ceci dans un fragment?

java.lang.RuntimeException: impossible de démarrer l'activité ComponentInfo {com.lacas.asd / com.lacas.asd.ui.activities.testtabs.TestTab2Activity}: java.lang.RuntimeException: impossible de créer une instance de la classe com.lacas.asd .db.room.BookmarkViewModel chez android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2924) chez android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2985) chez android.app.ActivityThread.-wrap14 (ActivityThread.java. à android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1635) à android.os.Handler.dispatchMessage (Handler.java:102) à android.os.Looper.loop (Looper.java:154) à android. app.ActivityThread.main (ActivityThread.java:6692) à java.lang.reflect.Method.invoke (Méthode native) à com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1468) à com. android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) Causé b y: java.lang.RuntimeException: Impossible de créer une instance de la classe com.lacas.asd.db.room.BookmarkViewModel sur android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.create (ViewModelProvider.java:207) sur android.arch.lifecycle .ViewModelProvider.get (ViewModelProvider.java:134) à android.arch.lifecycle.ViewModelProvider.get (ViewModelProvider.java:102) à com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewMokeodel $ 2.Tinvctivity ($ 2.Activity. kt: 34) sur com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke (TestTab2Activity.kt: 29) sur kotlin.UnsafeLazyImpl.getValue (Lazy.kt: 154) sur com.lacas.asd. ui.activities.testtabs.TestTab2Activity.getViewModel (TestTab2Activity.kt) à com.lacas.asd.ui.activities.testtabs.TestTab2Activity.onCreated (TestTab2Activity.kt: 45) à com.lacas.asd.ui.activities.testtabs.TestTab2Activity.onCreated (TestTab2Activity.kt: 45) à com.lacas.asd.base. BasePermissionsActivity.kt: 34) sur android.app.Activity. performCreate (Activity.java:6912) à android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1126) à android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2877) à android.app.ActivityThread.handleLaunchActivity (ActivityThread.handleLaunchActivity (ActivityThread.handleLaunchActivity (ActivityThread.handleLaunchActivity) : 2985) sur android.app.ActivityThread.-wrap14 (ActivityThread.java) sur android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1635) sur android.os.Handler.dispatchMessage (Handler.java:102) sur android.os.Looper.loop (Looper.java:154) sur android.app.ActivityThread.main (ActivityThread.java:6692) sur java.lang.reflect.Method.invoke (méthode native) sur com.android.internal. os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1468) à com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) Causé par: java.lang.reflect.InvocationTargetException à java.lang.reflect. Constructor.newInstance0 (Nativ e Method) sur java.lang.reflect.Constructor.newInstance (Constructor.java:430) sur android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory.create (ViewModelProvider.java:199) sur android.arch.lifecycle.ViewModelProvider.get ( ViewModelProvider.java:134) sur android.arch.lifecycle.ViewModelProvider.get (ViewModelProvider.java:102) sur com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke (TestTab2Activity.kt) com.lacas.asd.ui.activities.testtabs.TestTab2Activity $ viewModel $ 2.invoke (TestTab2Activity.kt: 29) à kotlin.UnsafeLazyImpl.getValue (Lazy.kt: 154) à com.lacas.asd.ui.activities.tabs .TestTab2Activity.getViewModel (TestTab2Activity.kt) sur com.lacas.asd.ui.activities.testtabs.TestTab2Activity.onCreated (TestTab2Activity.kt: 45) sur com.lacasas.asd.ui.activities.testtabs.TestTab2Activity.onCreated (TestTab2Activity.kt: 45) sur com.lacasas.asd.base.BasePermissionsActivity.BasePermissionsActivity.asd.base.BasePermissionsActivity. ) Sur android.app.Activity.performCrea te (Activity.java:6912) à android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1126) à android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2877) à android.app.ActivityThread.handleLaunchActivity (ActivityThread.java : 2985) sur android.app.ActivityThread.-wrap14 (ActivityThread.java) sur android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1635) sur android.os.Handler.dispatchMessage (Handler.java:102) sur android.os.Looper.loop (Looper.java:154) sur android.app.ActivityThread.main (ActivityThread.java:6692) sur java.lang.reflect.Method.invoke (méthode native) sur com.android.internal. os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1468) à com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) Causé par: java.lang.RuntimeException: impossible de trouver l'implémentation pour com.lacas. asd.db.room.BookmarkDb. BookmarkDb_Impl fait

6
lacas 23 mai 2018 à 13:00

6 réponses

Meilleure réponse

Comme quelqu'un l'a dit ici:

Salle Android persistante: AppDatabase_Impl n'existe pas

La solution était:

Implémentation "androidx.lifecycle: lifecycle-extensions: $ lifecycle_version" kapt "androidx.lifecycle: lifecycle-compiler: $ lifecycle_version"

implementation "androidx.room:room-runtime:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"


implementation "androidx.paging:paging-runtime:$paging_version"
11
Tushar Ahmed 24 avril 2020 à 10:56

Changer viewModel = ViewModelProviders.of(activity!!).get(BookmarkViewModel::class.java)

À viewModel = ViewModelProviders.of(this).get(BookmarkViewModel::class.java)

De plus, n'instanciez pas le viewModel vers null. Changez-le en lateinit var de cette façon, vous n'avez pas à instancier immédiatement (mais vous dites à Kotlin que vous allez l'instancier avant d'y accéder). Vous pouvez faire ceci comme ceci: private lateinit var viewModel: BookMarkViewModel

EDIT La racine du problème était que le Room Dependencies où soit pas sur la même version soit annotationProcessor a été utilisé au lieu de kapt (kapt est requis lors de l'utilisation de Kotlin)

4
Rene Ferrari 23 mai 2018 à 11:34

Ces 3 choses ont fonctionné pour moi:

  1. Ajouter / conserver à la fois annotationProcessor et Kapt dans les dépendances

annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version" kapt "android.arch.lifecycle:compiler:$lifecycle_version"

annotationProcessor "android.arch.persistence.room:compiler:$room_version" kapt "android.arch.persistence.room:compiler:$room_version"

  1. Ajout de apply plugin: 'kotlin-kapt' en haut de build.gradle (application) et nettoyage du projet

  2. Réinstaller l'application

1
nb2998 21 sept. 2018 à 15:00

Dans mon cas, j'ai été ajouté private set dans DatabaseClass : | Je l'ai enlevé.

  private var INSTANCE: NoteDatabase? = null
            private set

À :

private var INSTANCE: NoteDatabase? = null

Ce problème prend mes 2 heures: |||

1
sana ebadi 23 nov. 2019 à 20:06

Dans mon cas, j'avais oublié d'annoter ma classe DatabaseClass avec

@Database(entities = [Book::class], version = 1)
abstract class BookRoomDatabase: RoomDatabase() 
0
Dawit Abraham 23 sept. 2019 à 16:21

Supprimer kapt "xxxx.xxx." si vous l'utilisez toujours dans votre gradle.build car il est obsolète et ajoutez

apply plugin: 'kotlin-kapt'

À la fin de votre gradle.build pour le module d'application. qui a résolu mon problème dans Android Studio 3.1

2
JimmyFlash 11 juil. 2018 à 09:02