android - 房间+ Dagger 2. NPE

标签 android kotlin dagger-2 android-room

使用 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()

返回null的dagger 2中的方法

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

对象的注入(inject)

@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,返回类型应该是 MonthlyBudget? - kotlin 表示带有 ? 的可空类型。

关于android - 房间+ Dagger 2. NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47366718/

相关文章:

java - 抛出 RecyclerView 后 layout_centerInParent 不工作

java - Android EffectFactory 位图

annotations - Kotlin可重复的@annotations在jdk-8上不起作用

java - Android列出所有ftp文件夹和子文件夹

android - TextInputLayout 的 colorControlActivated 不起作用

java - fragment 内旋转器基本适配器出现 NullPointerException 错误

intellij-idea - 预期的类没有实际声明

android - Jenkins:Android 项目构建失败(生成数据绑定(bind)/ Dagger 类失败)

android - Dagger : Why does dagger require a @inject constructor for an object that does't depend on another object

java - 如何从 fragment 中获取 dagger 依赖项注入(inject)的上下文