Функция sum () в Sqlite не работает должным образом с библиотекой постоянства помещения - PullRequest
0 голосов
/ 25 января 2020

Я хочу вычислить сумму поля веса всех записей в таблице, я пытался:

В классе Дао

@Dao
interface FooDAO {
    @Query("SELECT sum(purchaseWeight) FROM myTable")
    suspend fun calculateSumOfAllWeight(): Int    
}

В классе репозитория

class FooRepository(application: Application) {

    private var fooDAO: FooDAO

    private var sumOfAllWeight = MutableLiveData<Int>()

    init {
        // skipping other code
        CoroutineScope(Dispatchers.IO).launch {
             sumOfAllWeight.postValue(fooDAO.calculateSumOfAllWeight())
        }
    }

    fun getSumOfAllWeight(): MutableLiveData<Int> {    
        Log.e("SUM_OF_WEIGHT", " sumOfAllWeight "+ sumOfAllWeight.value)
        return sumOfAllWeight    
    }    
}

но он печатает

E/SUM_OF_WEIGHT: sumOfAllWeight null

в logcat, я упоминал This Link для работы с sum () в sqlite.

Обновление

Я искал и нашел это и это SO сообщений и обновлений

@Query("SELECT sum(purchaseWeight) as value FROM myTable")
suspend fun calculateSumOfAllWeight(): Int

и найдено Этот и обновленный

@Query("SELECT COALESCE(sum(COALESCE(purchaseWeight,0)), 0) From myTable")
suspend fun calculateSumOfAllWeight(): Int

, но все тот же null возвращается

1 Ответ

0 голосов
/ 25 января 2020

Агрегатные функции в sql возвращают ноль, когда таблица пуста. Только функция COUNT возвращает 0. Вы также читаете значение LivaData, которое обновляется асинхронно, и вы не уверены, что запрос уже выполнен. Попробуйте поместить журнал в блок init после функции suspend, чтобы проверить возвращаемое значение.

...