2017-07-14 1 views
1

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

Antwort

0

finde ich diesen Code verwende:

@Database(entities = arrayOf(User::class), version = 1) 
abstract class AppDatabase : RoomDatabase() { 

    abstract fun userModel(): UserDao 

    companion object { 
     private const val DB_NAME = "users.db" 

     fun createPersistentDatabase(context: Context): AppDatabase 
       = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, DB_NAME).build() 
    } 
} 

Und ich bin es Injektion mit:

@Singleton @Provides fun provideApp(context: Context) = AppDatabase.createPersistentDatabase(context) 
+0

Diese im Grunde der gleiche Code, nur die Schaffung Code wird in die AppDatabase-Klasse verschoben –

Verwandte Themen