【问题标题】:Cannot create an instance of an abstract class in MainActivity无法在 MainActivity 中创建抽象类的实例
【发布时间】:2021-06-18 05:52:25
【问题描述】:

我是 kotlin 的新手。我不知道如何解决这个错误。 我收到“无法创建抽象类的实例”编译错误,我在 MainActivity 中遇到以下行:

val newsRepository = NewsRepository(ArticleDatabase(this))

MainActivity.kt:

val newsRepository = NewsRepository(ArticleDatabase(this))  --->Compile error line
val viewModelProviderFactory = NewsViewModelProviderFactory(newsRepository)
viewModel = ViewModelProvider(this, viewModelProviderFactory).get(NewsViewModel::class.java)

bottomNavigationView.setupWithNavController(newsNavHostFragment.findNavController())

NewsRepository.kt:

 class NewsRepository(val db: ArticleDatabase) {

    suspend fun getBreakingNews(countryCode: String, pageNumber: Int) =
        RetrofitInstance.api.getBreakingNews(countryCode, pageNumber)

}

ArticleDatabase.kt:

@Database(
    entities = [Article::class],
    version = 1
)

@TypeConverters(Converters::class)
abstract class ArticleDatabase() : RoomDatabase() {

    abstract fun getArticleDao(): ArticleDao

    companion object{
        
        @Volatile
        private var instance: ArticleDatabase? = null
    }

    private val LOCK = Any()


    operator fun invoke(context: Context) = instance?: synchronized(LOCK){


          instance ?: createDatabase(context).also{ instance = it }

    }

    private fun createDatabase(context: Context) =
        Room.databaseBuilder(context.applicationContext,
            ArticleDatabase::class.java,
            "article_db.db").build()


    override fun createOpenHelper(config: DatabaseConfiguration?): SupportSQLiteOpenHelper {
        TODO("Not yet implemented")
    }

    override fun createInvalidationTracker(): InvalidationTracker {
        TODO("Not yet implemented")
    }

    override fun clearAllTables() {
        TODO("Not yet implemented")
    }


}

编辑:添加了 ArticleDatabase 类的完整代码。

【问题讨论】:

    标签: kotlin mvvm android-room android-jetpack


    【解决方案1】:

    查看this如何正确使用Room的教程

    你需要实际创建数据库实例

    val db = Room.databaseBuilder(
                applicationContext,
                ArticleDatabase::class.java, "database-name"
            ).build()
    

    然后将其注入到存储库中

    val newsRepository = NewsRepository(db) 
    

    【讨论】:

    • 请检查已编辑的班级名称文章数据库。我已经创建了数据库
    • 好的,那你需要把创建的db传给NewsRepository,不要再创建了
    【解决方案2】:

    将代码 invoke 函数放入伴随对象中以解决此问题。

    abstract class ArticleDatabase : RoomDatabase() {
    
        abstract fun getArticleDao(): ArticleDao
    
        companion object{
            
            @Volatile
            private var instance: ArticleDatabase? = null
    
            private val LOCK = Any()
    
    
            operator fun invoke(context: Context) = instance?: synchronized(LOCK){
              instance ?: createDatabase(context).also{ instance = it }
    
        }
    
        }
    
        private fun createDatabase(context: Context) =
            Room.databaseBuilder(context.applicationContext,
                ArticleDatabase::class.java,
                "article_db.db").build()
    
    
        override fun createOpenHelper(config: DatabaseConfiguration?): SupportSQLiteOpenHelper {
            TODO("Not yet implemented")
        }
    
        override fun createInvalidationTracker(): InvalidationTracker {
            TODO("Not yet implemented")
        }
    
        override fun clearAllTables() {
            TODO("Not yet implemented")
        }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多