代码之家  ›  专栏  ›  技术社区  ›  imin

转换为Kotlin

  •  0
  • imin  · 技术社区  · 7 年前

    我在跟踪 this tutorial 但现在我想把wordrepository类转换成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类型的可空接收器?

    1 回复  |  直到 7 年前
        1
  •  1
  •   crgarridos    7 年前

    这里的问题是你要返回一个 可为空 调用时的实例(问号类型) WordRoomDatabase.getInstance() 因为它的签名。

    你可以改变你的 getInstance 致:

        fun getInstance(context: Context): WordRoomDatabase {
            if (INSTANCE == null){
                synchronized(WordRoomDatabase::class){
                    INSTANCE = when you call [https://kotlinlang.org/docs/reference/null-safety.html#safe-calls](https://kotlinlang.org/docs/reference/null-safety.html#safe-calls)Room.databaseBuilder(context.getApplicationContext(),
                            WordRoomDatabase::class.java, "sps.db")
                            .build()
                }
            }
            return INSTANCE as WordRoomDatabase
        }
    

    为了进一步了解可空类型和安全调用,这里有一些有用的链接:

    https://kotlinlang.org/docs/reference/null-safety.html#safe-calls

    https://www.callicoder.com/kotlin-nullable-types-null-safety/