injiziere Ich bin gerade mit der neuen Zimmer-Bibliothek vertraut, und ich kam durch ein lästiges Problem. Ich habe eine UserRepository
Klasse, die das Laden der Daten vom Netzwerk und vom lokalen Speicher abhängig von mehreren Faktoren durchführt. Als ich das Dao Objekt aus der Datenbank injizieren wollen, bekomme ich diesen Fehler:Zimmer mit Dolch in Kotlin: Dao ist null, wenn ich in eine Klasse
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull
Hier werden die Teile des Codes sind, was diesen Fehler
ApplicationModule verursachen
@Module
class ApplicationModule(val application: CustomApplication) {
private val BASE_URL = "https://api.stackexchange.com/2.2/"
@Provides
@Singleton
fun provideAppContext() : Context = application
@Provides
@Singleton
fun provideRetrofit(): Retrofit = Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(Gson()))
.baseUrl(BASE_URL)
.build()
@Provides
@Singleton
fun provideUserRepository(retrofit: Retrofit, database: AppDatabase) =
UserRepository(
retrofit.create(UserService::class.java),
retrofit.create(QuestionService::class.java),
database.userDao())
@Provides
@Singleton
fun provideDatabase(context: Context)
= Room.databaseBuilder(context, AppDatabase::class.java, "db-name").build()
}
UserDao
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAllUsers() : Flowable<List<User>>
@Insert
fun insertAll(users: List<User>)
}
AppDatabase
@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao() : UserDao
}
Hat jemand eine Idee warum database.userDao()
könnte null sein? Muss ich eine zusätzliche Initialisierung durchführen, bevor ich sie von der Datenbank anfordern kann? Ich kann es nicht Informationen zu dieser überall
Diese im Grunde der gleiche Code, nur die Schaffung Code wird in die AppDatabase-Klasse verschoben –