Комната + кинжал 2. NPE

Использование Room + LiveData + Dagger2 + Kotlin

db-код:

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

Метод в кинжале2, который обеспечивает db

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

Метод в кинжале 2, который возвращает нуль

 @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 

Вот как я это сделал: создал nullcheck, и если «If» возвращается «true», я добавляю значения по умолчанию в db.

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

Что мне делать? Заполнить db? Если да, скажите мне, как лучше это сделать, или есть другой способ?

Я думаю, вам нужно установить @Nullable на provideCurrentMonthBudget . Кроме того, поскольку это kotlin, возвращаемый тип должен быть MonthlyBudget? – kotlin обозначает типы с нулевым значением с ? ,