房间+匕首2. NPE

使用房间+ LiveData + Dagger2 + Kotlin

分贝代码:

@Database(entities = arrayOf(MonthlyBudget::class, Purchase::class), version = 1, exportSchema = false) @TypeConverters(DateTypeConverter::class) abstract class AppDatabase : RoomDatabase() { abstract fun budgetDAO(): BudgetDAO abstract fun purchaseDAO(): PurchaseDAO } 

在提供db的dagger2中的方法

 @Provides fun providesAppDatabase(context: Context): AppDatabase = Room.databaseBuilder(context, AppDatabase::class.java, "my-budget-db").allowMainThreadQueries().build() 

在匕首2中返回null的方法

 @Provides @Singleton @Named("CurrentMonthBudget") fun provideCurrentMonthBudget(repository: AppRepository): MonthlyBudget = repository.currentMonthBudget() 

对象的注入

 @Inject @Nullable @field:Named("CurrentMonthBudget") lateinit var currentMonthBudget: MonthlyBudget 

由于空数据我得到这个

 java.lang.NullPointerException: Cannot return null from a non-@Nullable @Provides method 

这是我做到这一点:创建一个空检查,如果’如果’返回’真’,我在数据库中添加默认值。

 @Database(entities = arrayOf(MonthlyBudget::class, Purchase::class), version = 1, exportSchema = false) @TypeConverters(DateTypeConverter::class) abstract class AppDatabase : RoomDatabase() { abstract fun budgetDAO(): BudgetDAO abstract fun purchaseDAO(): PurchaseDAO companion object { fun getInstance(context:Context):AppDatabase { val database = Room.databaseBuilder(context, AppDatabase::class.java, "my-budget-db").allowMainThreadQueries().build() if (database.budgetDAO().queryCurrentMonthBudget() == null) { database.budgetDAO().insert(MonthlyBudget(0), MonthlyBudget(0)) database.purchaseDAO().insert(Purchase("default",0)) } return database } } } 

我该怎么办? 填充数据库? 如果是这样,告诉我更好的方式做,或者有另一种方式?

我认为你需要在@Nullable上设置@Nullable 。 也因为这是kotlin,返回types应该是MonthlyBudget MonthlyBudget? – kotlin表示可空的types与?

Interesting Posts