I want to inject a singleton SqliteOpenHelper
in a ContentProvider
. However, it seems that the ContentProvider
instance is being built bef
based on @Mick answer and @LeEnot article I posted an article on Medium using new Dagger 2 features.
https://medium.com/@pedro.henrique.okawa/content-providers-dependency-injection-dagger-2-4ee3e49777b
But basically I put the Dagger-Android dependency:
// In my case I used 2.16 version
implementation 'com.google.dagger:dagger-android:[DaggerVersion]'
Implemented my custom Application class with HasContentProviderInjector interface and changed to inject my dependencies on attachBaseContext:
class App : Application(), HasActivityInjector, HasContentProviderInjector {
@Inject
lateinit var androidInjector: DispatchingAndroidInjector
@Inject
lateinit var contentProviderInjector: DispatchingAndroidInjector
override fun activityInjector() = androidInjector
override fun contentProviderInjector() = contentProviderInjector
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
setupDependencyInjection()
}
/**
* Injects the app component
*/
private fun setupDependencyInjection() {
DaggerAppComponent.builder().application(this).build().inject(this)
}
}
And injected my databaseHelper instance on my ContentProvider class:
class VoIPAppProvider: ContentProvider() {
@Inject
lateinit var databaseHelper: DatabaseHelper
override fun onCreate(): Boolean {
AndroidInjection.inject(this)
return true
}
override fun insert(uri: Uri?, contentValues: ContentValues?): Uri? {
...
return uri
}
override fun query(uri: Uri?, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String?): Cursor {
...
return cursor
}
override fun getType(uri: Uri?): String {
...
return type
}
override fun update(uri: Uri?, contentValues: ContentValues?, selection: String?, selectionArgs: Array?): Int {
...
return rowsUpdated
}
override fun delete(uri: Uri?, selection: String?, selectionArgs: Array?): Int {
...
return rowsDeleted
}
}
PS: I decided to not use DaggerContentProvider class because most of us may already have a base class for some Android components.
I hope it help you and thanks again to @Mick and @LeEnot