房间+匕首 2. NPE
Room+dagger 2. NPE
使用 Room+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
}
dagger2中提供db的方法
@Provides
fun providesAppDatabase(context: Context): AppDatabase = Room.databaseBuilder(context, AppDatabase::class.java, "my-budget-db").allowMainThreadQueries().build()
dagger 2 中的方法 return 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
我是这样做的:创建一个 nullcheck,如果 'If' 返回 'true',我在数据库中添加默认值。
@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
}
}
}
我该怎么办?填写数据库?如果是这样,请告诉我更好的方法,或者有其他方法吗?
我认为您需要在 provideCurrentMonthBudget
上设置 @Nullable
。此外,由于这是 kotlin,return 类型应该是 MonthlyBudget?
- kotlin 表示具有 ?
.
的可空类型
使用 Room+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
}
dagger2中提供db的方法
@Provides
fun providesAppDatabase(context: Context): AppDatabase = Room.databaseBuilder(context, AppDatabase::class.java, "my-budget-db").allowMainThreadQueries().build()
dagger 2 中的方法 return 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
我是这样做的:创建一个 nullcheck,如果 'If' 返回 'true',我在数据库中添加默认值。
@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
}
}
}
我该怎么办?填写数据库?如果是这样,请告诉我更好的方法,或者有其他方法吗?
我认为您需要在 provideCurrentMonthBudget
上设置 @Nullable
。此外,由于这是 kotlin,return 类型应该是 MonthlyBudget?
- kotlin 表示具有 ?
.