2017-07-14 83 views
1

我刚刚熟悉新房间库,并且我遇到了一个烦人的问题。我有一个UserRepository类,它根据多个因素从网络和本地存储装载数据。当我想从数据库中注入DAO对象,我得到这个错误:Kotlin中的匕首房间:当注入类时Dao为空

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull

这里是代码的部分,什么可能导致此错误

ApplicationModule

@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 
} 

有谁知道为什么database.userDao()可能为空?在我从数据库请求它之前,是否需要执行额外的初始化?我无法找到信息关于这个随时随地

回答

0

我使用这个代码:

@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) 
+0

这基本上是相同的代码,只需创建代码被移动到AppDatabase类 –