Android 科特林带匕首的房间:当注入一个类时,刀是空的
我刚刚熟悉了新房间的图书馆,遇到了一个恼人的问题。我有一个Android 科特林带匕首的房间:当注入一个类时,刀是空的,android,kotlin,dagger-2,android-room,Android,Kotlin,Dagger 2,Android Room,我刚刚熟悉了新房间的图书馆,遇到了一个恼人的问题。我有一个UserRepository类,它根据多种因素从网络和本地存储加载数据。当我想从数据库中注入Dao对象时,会出现以下错误: java.lang.IllegalArgumentException:指定为非null的参数为null:method kotlin.jvm.internal.Intrinsics.checkParametersNotNull 下面是部分代码,是什么导致了这个错误 应用模块 @Module class Appl
UserRepository
类,它根据多种因素从网络和本地存储加载数据。当我想从数据库中注入Dao对象时,会出现以下错误:
java.lang.IllegalArgumentException:指定为非null的参数为null:method kotlin.jvm.internal.Intrinsics.checkParametersNotNull
下面是部分代码,是什么导致了这个错误
应用模块
@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()
}
用户道
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAllUsers() : Flowable<List<User>>
@Insert
fun insertAll(users: List<User>)
}
有人知道为什么database.userDao()
可以为空吗?在从数据库请求之前,是否需要进行额外的初始化?我在任何地方都找不到有关此的信息我正在使用此代码:
@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()
}
}
我用以下方法注射它:
@Singleton @Provides fun provideApp(context: Context) = AppDatabase.createPersistentDatabase(context)
我正在使用以下代码:
@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()
}
}
我用以下方法注射它:
@Singleton @Provides fun provideApp(context: Context) = AppDatabase.createPersistentDatabase(context)
这基本上是相同的代码,只是创建代码被移动到AppDatabase类这基本上是相同的代码,只是创建代码被移动到AppDatabase类