在 Kotlin 中获取抽象 class 中的对象
Get an object inside an abstract class in Kotlin
我正在尝试在 Kotlin 中复制以下 Java class。
@Database(entities = {Word.class}, version = 1)
public abstract class WordRoomDatabase extends RoomDatabase {
public abstract WordDao wordDao();
private static WordRoomDatabase INSTANCE;
static WordRoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (WordRoomDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
WordRoomDatabase.class, "word_database")
.build();
}
}
}
return INSTANCE;
}
}
我正在关注代码实验室的 tutorial,以使用 Room 实现一个简单的 SQLite 数据库。以下是我对 class.
的完整 Kotlin 实现
@Database(entities = [Word::class], version = 1)
abstract class WordRoomDatabase : RoomDatabase() {
abstract fun wordDao(): WordDao
private class PopulateDbAsync(db: WordRoomDatabase) : AsyncTask<Unit, Unit, Unit>() {
private val dao = db.wordDao()
override fun doInBackground(vararg params: Unit) {
dao.deleteAll()
var word = Word("Hello")
dao.insert(word)
word = Word("World")
dao.insert(word)
}
}
companion object {
private var INSTANCE: WordRoomDatabase? = null
private val roomDatabaseCallback = object : RoomDatabase.Callback() {
override fun onOpen(db: SupportSQLiteDatabase) {
super.onOpen(db)
PopulateDbAsync(INSTANCE as WordRoomDatabase).execute()
}
}
fun getDatabase(context: Context): WordRoomDatabase {
if (INSTANCE == null) {
synchronized(WordRoomDatabase::class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.applicationContext,
WordRoomDatabase::class.java, "word_database")
.addCallback(roomDatabaseCallback)
.build()
}
}
}
return INSTANCE as WordRoomDatabase
}
}
}
当我尝试访问伴随对象中的数据时,出现以下错误。 cannot find implementation for com.fifthgen.androidroomtest.data.WordRoomDatabase.WordRoomDatabase_Impl does not exist
这是发生错误的代码行。
private val db = WordRoomDatabase.getDatabase(application)
按照 Luksprog 的建议向 build.gradle
添加了房间编译器和 Kotlin 插件,一切正常。
apply plugin: 'kotlin-kapt'
// .....
kapt 'android.arch.persistence.room:compiler:1.1.0'
我正在尝试在 Kotlin 中复制以下 Java class。
@Database(entities = {Word.class}, version = 1)
public abstract class WordRoomDatabase extends RoomDatabase {
public abstract WordDao wordDao();
private static WordRoomDatabase INSTANCE;
static WordRoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (WordRoomDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
WordRoomDatabase.class, "word_database")
.build();
}
}
}
return INSTANCE;
}
}
我正在关注代码实验室的 tutorial,以使用 Room 实现一个简单的 SQLite 数据库。以下是我对 class.
的完整 Kotlin 实现@Database(entities = [Word::class], version = 1)
abstract class WordRoomDatabase : RoomDatabase() {
abstract fun wordDao(): WordDao
private class PopulateDbAsync(db: WordRoomDatabase) : AsyncTask<Unit, Unit, Unit>() {
private val dao = db.wordDao()
override fun doInBackground(vararg params: Unit) {
dao.deleteAll()
var word = Word("Hello")
dao.insert(word)
word = Word("World")
dao.insert(word)
}
}
companion object {
private var INSTANCE: WordRoomDatabase? = null
private val roomDatabaseCallback = object : RoomDatabase.Callback() {
override fun onOpen(db: SupportSQLiteDatabase) {
super.onOpen(db)
PopulateDbAsync(INSTANCE as WordRoomDatabase).execute()
}
}
fun getDatabase(context: Context): WordRoomDatabase {
if (INSTANCE == null) {
synchronized(WordRoomDatabase::class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.applicationContext,
WordRoomDatabase::class.java, "word_database")
.addCallback(roomDatabaseCallback)
.build()
}
}
}
return INSTANCE as WordRoomDatabase
}
}
}
当我尝试访问伴随对象中的数据时,出现以下错误。 cannot find implementation for com.fifthgen.androidroomtest.data.WordRoomDatabase.WordRoomDatabase_Impl does not exist
这是发生错误的代码行。
private val db = WordRoomDatabase.getDatabase(application)
按照 Luksprog 的建议向 build.gradle
添加了房间编译器和 Kotlin 插件,一切正常。
apply plugin: 'kotlin-kapt'
// .....
kapt 'android.arch.persistence.room:compiler:1.1.0'