Использование функций репозитория в viewModel с coruntineScope в android Room - PullRequest
0 голосов
/ 03 февраля 2020

Работа с Androind и Room в первый раз, и я смог выполнить несколько кодовых меток и учебных пособий, чтобы добиться вставки и отображения списка моих сущностей, но я не могу использовать другие мои методы репозитория в моем ViewModel из-за несоответствия типов, вот мой файл ViewModel

class CustomerViewModel(application: Application) : AndroidViewModel(application) {

    // The ViewModel maintains a reference to the repository to get data.
    private val repository: CustomerRepository
    // LiveData gives us updated words when they change.
    val allCustomers: LiveData<List<Customer>>

    init {
        // Gets reference to Dao from db to construct
        // the correct repo.
        val customerDao = AppDatabase.getInstance(application).customerDao()
        repository = CustomerRepository(customerDao)
        allCustomers = repository.getCustomers()
    }

    fun insert(customer: Customer) = viewModelScope.launch {
        repository.insert(customer)
    }

}

, и я пытаюсь добавить метод, подобный

fun find(id: Int) = viewModelScope.launch {
        return repository.getCustomerByLocalId(id)
    }

, но ide говорит, что здесь есть несоответствие типов? Required: Customer, Found: Job

вот мой репозиторий:

class CustomerRepository(private val customerDao: CustomerDao) {


    fun getCustomers(): LiveData<List<Customer>> = customerDao.getAlphabetizedCustomers()

    suspend fun getCustomerByLocalId(local_Id: Int): Customer =
        customerDao.customerByLocalId(local_Id)

    suspend fun insert(customer: Customer) {
        customerDao.insert(customer)
    }


    companion object {

        // For Singleton instantiation
        @Volatile
        private var instance: CustomerRepository? = null

        fun getInstance(customerDao: CustomerDao) =
            instance ?: synchronized(this) {
                instance ?: CustomerRepository(customerDao).also { instance = it }
            }
    }
}

методы в CustomerDao

@Query("SELECT * from customers ORDER BY name ASC")
    fun getAlphabetizedCustomers(): LiveData<List<Customer>>

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insert(customer: Customer)

    @Query("SELECT * FROM customers WHERE local_id = :localId")
    suspend fun customerByLocalId(localId: Int): Customer

РЕДАКТИРОВАТЬ Я пытался @ lena-bru 's предложение, но ошибка все еще там, кажется, есть 2 разных, несоответствие типов и что не должно быть возврата. Вы должны создать этот метод в другом месте? Ошибка IDE

1 Ответ

1 голос
/ 03 февраля 2020

изменить это:

   fun find(id: Int) = viewModelScope.launch {
        return repository.getCustomerByLocalId(id)
   }

на это:

   fun find(id: Int): Customer = viewModelScope.launch {
       withContext(Dispatchers.IO){
         repository.getCustomerByLocalId(id)
       }
   }

Ваш метод поиска, как определено выше, недействителен, он должен возвращать тип Customer

Также вы нужно предоставить контекст и удалить ключевое слово return

...