房间+匕首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与?
。