无法在 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")
}
}
我是科特林新手。我不知道如何解决这个错误。 我收到“无法创建抽象 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")
}
}