我在用Dagger2
. 我RoomDatabase
用于数据库访问。
我的房间设置:
道的
interface noteDao()
interface noteTypeDao()
interface userDao()
笔记库
@Singleton
class NoteRepository @Inject constructor(
private val noteDao: NoteDao,
private val noteTypeDao: NoteTypeDao,
private val userDao: UserDao
) {
}
应用数据库
@Database(entities = [Note::class, User::class, NoteType::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun noteDao(): NoteDao
abstract fun userDao(): UserDao
abstract fun noteTypeDao(): NoteTypeDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
val tempInstance = INSTANCE
if (tempInstance != null) {
return tempInstance
}
synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"NoteDatabase"
).build()
INSTANCE = instance
return instance
}
}
}
}
匕首 2 设置:
应用模块
@Module
class AppModule {
@Provides
fun provideNoteRepository(app: Application): NoteRepository {
return NoteRepository(
AppDatabase.getDatabase(app).noteDao(),
AppDatabase.getDatabase(app).noteTypeDao(),
AppDatabase.getDatabase(app).userDao()
)
}
@Provides
fun provideApplication(): Application {
return Application()
}
}
应用组件
@Component(modules = [AppModule::class])
interface AppComponent {
fun inject(app: MainActivity)
}
我AppDatabase
在行中得到一个 NullPointerExeption int context.applicationContext
。任何建议如何解决问题?AppDatabase 似乎没有从Dagger2
.
Application
是一个框架类,你不能仅仅通过调用它的构造函数来实例化它。相反,您需要将框架为您实例化的应用程序传递到您的模块中,并提供:
@Module
class AppModule(val application: Application) {
...
@Provides
fun provideApplication(): Application {
return application
}
}
现在,如果您AppComponent
之前像这样创建您的应用程序,则在您的应用程序中onCreate
(大概,因为这是通常的做法):
override fun onCreate() {
injector = DaggerAppComponent.create()
}
你必须用这样的东西替换它,将你的应用程序实例传递给模块,以便它可以提供它:
override fun onCreate() {
injector = DaggerAppComponent.builder()
.appModule(appModule(this))
.build()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句