【发布时间】:2018-07-14 17:33:32
【问题描述】:
我正在关注this tutorial,但现在我想将 WordRepository 类转换为 kotlin。我对 kotlin 非常陌生,所以我尝试使用 this online kotlin converter 并从第一个链接复制粘贴 java WordRepository 类。下面是原始的java代码btw:
public class WordRepository {
private WordDao mWordDao;
private LiveData<List<Word>> mAllWords;
WordRepository(Application application) {
WordRoomDatabase db = WordRoomDatabase.getDatabase(application);
mWordDao = db.wordDao();
mAllWords = mWordDao.getAllWords();
}
LiveData<List<Word>> getAllWords() {
return mAllWords;
}
public void insert (Word word) {
new insertAsyncTask(mWordDao).execute(word);
}
private static class insertAsyncTask extends AsyncTask<Word, Void, Void> {
private WordDao mAsyncTaskDao;
insertAsyncTask(WordDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Void doInBackground(final Word... params) {
mAsyncTaskDao.insert(params[0]);
return null;
}
}
}
以下是我从在线转换器获得的 kotlin 代码:
class WordRepository internal constructor(application:Application) {
private val mWordDao:WordDao
internal val allWords:LiveData<List<Word>>
init{
val db = WordRoomDatabase.getDatabase(application)
mWordDao = db.wordDao()
allWords = mWordDao.getAllWords()
}
fun insert(word:Word) {
insertAsyncTask(mWordDao).execute(word)
}
private class insertAsyncTask internal constructor(dao:WordDao):AsyncTask<Word, Void, Void>() {
private val mAsyncTaskDao:WordDao
init{
mAsyncTaskDao = dao
}
protected fun doInBackground(vararg params:Word):Void {
mAsyncTaskDao.insert(params[0])
return null
}
}
}
请注意,为了使上面的代码工作,我改变了
WordRoomDatabase.getDatabase(application)
到
WordRoomDatabase.getInstance(application)
因为我也将 WordRoomDatabase 更改为 kotlin,并且它不再具有 getDatabase 功能。这是 WordRoomDatabase 的样子
abstract class WordRoomDatabase: RoomDatabase(){
companion object {
private var INSTANCE: WordRoomDatabase? = null
fun getInstance(context: Context): WordRoomDatabase? {
if (INSTANCE == null){
synchronized(WordRoomDatabase::class){
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
WordRoomDatabase::class.java, "sps.db")
.build()
}
}
return INSTANCE
}
fun destroyInstance(){
INSTANCE == null
}
}
}
但是,代码不起作用,特别是这部分:
mWordDao = db.wordDao();
显示错误
只有安全 (?.) 或非空断言 (!!.) 调用才允许在 AppDatabase 类型的可空接收器?
【问题讨论】:
-
@JoeC 我尝试按照您提供的链接中的解决方案进行操作,但随后显示错误“类型不匹配。需要wordDao,找到wordDao了吗?
-
我的建议是避免以这种方式转换代码,这在学习 kotlin 时会有所帮助,并且您已经知道 java 但它不是解决方案,学习 kotlin 然后重写它。
-
WordRoomDatabase.getDatabase()返回什么?它是否返回AppDatabase?还是返回AppDatabase?? -
为了帮助您,问题是 Java 不提供空安全类型,而 kotlin 提供,正如您所见,您有
WordRoomDatabase?,这意味着INSTANCE可以为空, kotlin 不允许在不检查值是否为空的情况下调用此类类型的方法。
标签: kotlin