Вставьте и извлеките данные Room и Jetpack Compose.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Вставьте и извлеките данные Room и Jetpack Compose.

Сообщение Anonymous »

У меня есть следующая структура базы данных:
Изображение

Task может быть двух типов: день или период. Если он имеет тип Day, он будет иметь только одну строку в Task_Completion (задача длится только в течение этого дня), а если он имеет тип Period, у вас будет столько же Task_Completion строк в качестве продолжительности задачи (например, 10 июля – 29 июля --> 9 строк в Task_Completion).
Мое приложение имеет просмотр задач только за неделю, поэтому меня интересуют только задачи в выбранная неделя.
Тем не менее, у меня есть проблема с задачами периода: я не могу заранее создать все строки Task_Completion (например, это может длиться 10 лет, поэтому Я не могу вставить 3650 строк одновременно, пока пользователь этого ожидает).
Мой обходной путь заключался в том, чтобы вставить строки Task_Completion только для выбранной недели, а затем получить им показать пользовательский интерфейс, но я не знаю, как это сделать в Jetpack Compose, используя запросы suspend, которые возвращают Flow. Я также пробовал использовать транзакционную функцию, но она выполнялась в основном потоке, если я вызывал ее из ViewModel
Это код, который я пробовал далеко:
TaskDao
package com.pochopsp.dailytasks.data.database.dao

import androidx.room.Dao
import androidx.room.Query
import androidx.room.Transaction
import androidx.room.Upsert
import com.pochopsp.dailytasks.data.database.entity.Completion
import com.pochopsp.dailytasks.data.database.entity.Task
import com.pochopsp.dailytasks.data.database.entity.TaskPeriod
import com.pochopsp.dailytasks.domain.date.DatePeriod
import com.pochopsp.dailytasks.domain.task.TaskCardDto
import kotlinx.coroutines.flow.Flow
import java.util.Date

@Dao
interface TaskDao {

@Query("SELECT * FROM task INNER JOIN period ON task.id = period.taskId" +
" INNER JOIN completion ON task.id = completion.taskId" +
" WHERE date(startDate / 1000,'unixepoch') >= date(:weekStart / 1000,'unixepoch')" +
" AND date(startDate / 1000,'unixepoch') = date(t.startDate / 1000,'unixepoch')" +
" AND t.id NOT IN " +
"(SELECT c.taskId FROM completion c" +
" WHERE date(c.date / 1000,'unixepoch') >= date(:weekStart / 1000,'unixepoch')" +
" AND date(c.date / 1000,'unixepoch')

Подробнее здесь: https://stackoverflow.com/questions/786 ... ck-compose
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»