[英]Android + Kotlin + Hilt: How to provide. SQLiteDatabase
我在我的多模块 Android 应用程序中实现 Hilt 并且无法提供/注入 SQLiteDatabase(我在发布之前试图寻求帮助,但没有找到关于 SQLiteDatabase 的帮助)。
我的第一次尝试是下一个:
@Module
@InstallIn(SingletonComponent::class)
class Database {
@Provides
@Singleton
fun provideDatabase(database: SQLiteDatabase): SQLiteDatabase {
return database
}
}
但是建设者抱怨:
error: [Dagger/MissingBinding] android.database.sqlite.SQLiteDatabase cannot be provided without an @Inject constructor or an @Provides-annotated method.
我认为这可能是:
@Provides
@Singleton
fun provideDatabase(): SQLiteDatabase {
return SQLiteDatabase()
}
但现在它抱怨 init 在 SQLiteDatabase 中是私有的。
我被卡住了,我不知道如何为存储库提供数据库,我试图在构造函数中这样做:
class TrackRepository
@Inject constructor(
private var database: SQLiteDatabase) {
...
}
编辑1:将数据库“提供”从存储库模块移动到应用程序模块,错误完全不同。 现在它抱怨依赖循环,但对我来说很难清楚地理解错误消息:
/app/build/generated/hilt/component_sources/debug/com/myapp/myapp/app/AWApplication_HiltComponents.java:135: error: [Dagger/DependencyCycle] Found a dependency cycle:
public abstract static class SingletonC implements AWApplication_GeneratedInjector,
^
android.database.sqlite.SQLiteDatabase is injected at
com.myapp.myapp.app.Dependencies.provideDatabase(database)
android.database.sqlite.SQLiteDatabase is injected at
com.myapp.myapp.app.Dependencies.provideDatabase(database)
...
The cycle is requested via:
android.database.sqlite.SQLiteDatabase is injected at
com.artandwords.repository.local.ThoughtRepository(database, …)
com.artandwords.repository.local.ThoughtRepository is injected at
services.ThoughtService(repository)
services.ThoughtService is injected at
com.myapp.myapp.activities.thought.DisplayThoughtViewModel(…, thoughtService, …)
com.myapp.myapp.activities.thought.DisplayThoughtViewModel is injected at
com.myapp.myapp.activities.thought.DisplayThoughtViewModel_HiltModules.BindsModule.binds(arg0)
@dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.myapp.myapp.app.AWApplication_HiltComponents.SingletonC → com.myapp.myapp.app.AWApplication_HiltComponents.ActivityRetainedC → com.myapp.myapp.app.AWApplication_HiltComponents.ViewModelC]
好的,我自己找到了解决方案。 我没有尝试直接提供 SQLiteDatabase,而是尝试提供我的 SQLiteHelper,它扩展了 SQLiteOpenHelper,因此我可以访问 readableDatabase 和 writableDatabase。
尚不确定它是否会起作用,因为 Android Studio 中的“provideDatabase”方法未标记为黄色(在被任何类引用的意义上),但至少现在该应用程序已构建。
@Module
@InstallIn(SingletonComponent::class)
class Database {
@Provides
@Singleton
fun provideDatabase(database: SQLiteHelper): SQLiteHelper {
return database
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.