无法在 MainActivity 中创建抽象 class 的实例

Cannot create an instance of an abstract class in MainActivity

我是科特林新手。我不知道如何解决这个错误。 我收到“无法创建抽象 class 的实例”编译错误我在 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 的完整代码 class。

请参阅 this 教程,了解如何正确使用 Room

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

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

然后注入到版本库

val newsRepository = NewsRepository(db) 

将代码 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")
    }


}