程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在 appmodule 中获取 Room 数据库参考大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在 appmodule 中获取 Room 数据库参

开发过程中遇到在 appmodule 中获取 Room 数据库参的问题如何解决?下面主要结合日常开发的经验,给出你关于在 appmodule 中获取 Room 数据库参的解决方法建议,希望对你解决在 appmodule 中获取 Room 数据库参有所启发或帮助;

我有一个应用程序,我需要在创建它时预先填充我的数据库,我使用 dagger hilt 注入并提供依赖项(room daos),当我尝试插入数据时,它要求提供电影数据库,但不要不知道如何在 appmodule 中获取其引用,提前感谢您的帮助。

  • 这是我的数据库:
  // this is my database 
 
@Database(entitIEs = [DataModel::class,MovIEResultItem::class],version = 1,exportscheR_179_11845@a = falsE)
abstract class MovIEsDatabase : RoomDatabase() {
 
    abstract fun popularDao() : PopularMovIEsDao
 
}

  • 提供 dao 作为依赖
  @Singleton
    @ProvIDes
    fun provIDePopularMovIEsDao(movIEsDatabase: MovIEsDatabasE) : PopularMovIEsDao {
        return movIEsDatabase.popularDao()
    }
  • 提供数据库实例
  @Singleton
   @ProvIDes
   fun provIDeDatabase(@ApplicationContext context: Context): MovIEsDatabase {
       return Room.databaseBuilder(context.applicationContext,MovIEsDatabase::class.java,"movIE.db")
               .addCallBACk(object : RoomDatabase.CallBACk(){
                   overrIDe fun onCreate(db: SupportsqliteDatabasE) {
                       super.onCreate(db)

                       // here it asks for database instance,not sure how to get it 
                       provIDePopularMovIEsDao().insertPopularMovIEs(getMovIEResultItem())
                      
                   }
               })
               .fallBACkToDestructiveMigration()
               .build()
   }

解决方法

@Database(entities = [DataModel::class,MovieResultItem::class],version = 1,exportscheR_179_11845@a = falsE)
abstract class MoviesDatabase : RoomDatabase() {

    abstract fun popularDao(): PopularMoviesDao

    @Volatile
    private var INSTANCE: MoviesDatabase? = null

    @Singleton
    @Provides
    fun provideDatabase(@ApplicationContext context: Context): MoviesDatabase {
        return INSTANCE ?: synchronized(this) {
            val databaseInstance = Room.databaseBuilder(
                context.applicationContext,MoviesDatabase::class.java,"movie.db"
            )
                .fallBACkToDestructiveMigration()
                .addCallBACk(InsertDatabaseCallBACk())
                .build()

            INSTANCE = databaseInstance
            return instance



            private class InsertDatabaseCallBACk() :roomDatabase.CallBACk() {
                override fun onOpen(db: SupportsqliteDatabasE) {
                    super.onOpen(db)
                    INSTANCE?.let {
                        it.providePopularMoviesDao().insertPopularMovies(getMovieResultItem())
                    }
                }
            }
        }
    }
}

请您在类 @H_277_9@moviesDatabase 中使用上述代码。

  1. 这里我为数据库添加了一个 INSTANCE 变量,它被标记为 Volatile
  2. Volatile 意味着,它不会存储在本地缓存中。您可以浏览大量文章以了解有关 Volatile 的更多信息。
  3. 我修改了 provideDatabase 函数,以便将数据库实例存储在变量 INSTANCE
  4. 然后您可以在任何需要的地方使用此 INSTANCE
  5. 此外,为了简单性和可读性,我将回调分成 InsertDatabaseCallBACk 类。在这里您可以使用数据库 INSTANCE 来执行您的操作 providePopularMoviesDao().insertPopularMovies(getMovieResultItem())

注意:代码可能会显示语法错误或大括号错误,具体取决于您的设置和导入。不要担心,请稍作更改或添加大括号(如果需要),它应该可以正常工作。

大佬总结

以上是大佬教程为你收集整理的在 appmodule 中获取 Room 数据库参考全部内容,希望文章能够帮你解决在 appmodule 中获取 Room 数据库参考所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。