簡體   English   中英

Android + Kotlin + 刀柄:如何提供。 SQLite數據庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM