#1 ๊ฐ์
#1-1 ์ฑํ UI ๊ตฌํ์ ์ํ ์ฒซ ๊ฑธ์
'์ฑํ UI'์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ ์ฝ๋๋ก์ ๊ฐ์ง๋ ๊ฐ์ ํ ์ด๋ธ์ ์ ์ธํ๋ค.
#1-2 ๊ฐ์ ํ ์ด๋ธ (SQLite)
SELECT day_table.day_id AS day_id,
meal_table.meal_id AS meal_id,
day_table.day_date AS day_date,
meal_table.meal_time AS meal_time,
meal_table.meal_name AS meal_name,
/* NutritionInfo์ Column ์์ */
meal_table.overeating_excess AS overeating_excess,
meal_table.refined_sugar_excess AS refined_sugar_excess,
meal_table.refined_grain_excess AS refined_grain_excess,
meal_table.flour_excess AS flour_excess,
meal_table.fiber_quality AS fiber_quality,
meal_table.protein_quality AS protein_quality,
meal_table.sodium_excess AS sodium_excess
/* NutritionInfo์ Column ๋ */
FROM day_table
INNER JOIN meal_table ON meal_table.day_id = day_table.day_id
ORDER BY day_table.day_date DESC,
meal_table.meal_time DESC,
meal_table.meal_id DESC
์ฑํ UI๋ ๊ฐ์ฅ ์ต๊ทผ์ ์๋จ๋ถํฐ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ณด์ฌ์ค๋ค. ๋ฐ๋ผ์, Query๋ฌธ์ ์๋ 3๊ฐ์ ์ ๋ ฌ ๊ธฐ์ค์ ์ ๋ถ ๋ด๋ฆผ์ฐจ์(DESC)์ผ๋ก ๋์๋ค.
#2 ์ฝ๋ - ๊ฐ์ ํ ์ด๋ธ
#2-1 ๊ฐ์ ํ ์ด๋ธ (Room)
// package com.example.nutri_capture_new.db
import androidx.room.ColumnInfo
import androidx.room.DatabaseView
import androidx.room.Embedded
import java.time.LocalDate
import java.time.LocalTime
/*
Day ํ
์ด๋ธ์ dayId์ Day์ ์์์ธ Meal ํ
์ด๋ธ์ dayId๊ฐ ๊ฐ์(==) ์กฐ๊ฑด์ผ๋ก INNER JOINํ๋,
์ฒซ์งธ๋ก๋ Day.date์ ๋ํด ๋ด๋ฆผ์ฐจ์,
๋์งธ๋ก๋ Meal.time์ ๋ํด ๋ด๋ฆผ์ฐจ์,
์
์งธ๋ก๋ Meal.mealId์ ๋ํด ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ
*/
@DatabaseView("""
SELECT day_table.day_id AS day_id,
meal_table.meal_id AS meal_id,
day_table.day_date AS day_date,
meal_table.meal_time AS meal_time,
meal_table.meal_name AS meal_name,
/* NutritionInfo์ Column ์์ */
meal_table.overeating_excess AS overeating_excess,
meal_table.refined_sugar_excess AS refined_sugar_excess,
meal_table.refined_grain_excess AS refined_grain_excess,
meal_table.flour_excess AS flour_excess,
meal_table.fiber_quality AS fiber_quality,
meal_table.protein_quality AS protein_quality,
meal_table.sodium_excess AS sodium_excess
/* NutritionInfo์ Column ๋ */
FROM day_table
INNER JOIN meal_table ON meal_table.day_id = day_table.day_id
ORDER BY day_table.day_date DESC,
meal_table.meal_time DESC,
meal_table.meal_id DESC
""")
data class DayMealView(
@ColumnInfo(name = "day_id")
val dayId: Long,
@ColumnInfo(name = "meal_id")
val mealId: Long,
@ColumnInfo(name = "day_date")
var date: LocalDate,
@ColumnInfo(name = "meal_time")
var time: LocalTime,
@ColumnInfo(name = "meal_name")
var name: String,
@Embedded
val nutritionInfo: NutritionInfo
)
"db" ํจํค์ง์ ๋์๋ค.
#2-2 MainDatabase.kt
// package com.example.nutri_capture_new.db
...
@Database(
entities = ...,
views = [DayMealView::class],
version = ...
)
...
abstract class MainDatabase : RoomDatabase() {
...
}
๋ฐฉ๊ธ ์ ์ธํ ๊ฐ์ ํ ์ด๋ธ์ Room์ด ์ธ์ํ ์ ์๊ฒ views ํ๋กํผํฐ์ ์ถ๊ฐํด์ค๋ค.
#3 ์ฝ๋ - ๊ฐ์ ํ ์ด๋ธ์ ๋ ์ฝ๋ ํ์ธ
#3-1 DAO (MainDAO.kt)
...
@Dao
interface MainDAO {
...
@Query("SELECT * FROM DayMealView")
suspend fun getAllMeals(): List<DayMealView>
}
#3-2 Repository (MainRepository.kt)
...
class MainRepository(private val dao: MainDAO) {
...
suspend fun getAllMeals(): List<DayMealView> {
return dao.getAllMeals()
}
}
#3-3 ViewModel (NutrientViewModel.kt)
// package com.example.nutri_capture_new.nutrient
...
import android.util.Log
class NutrientViewModel(private val repository: MainRepository) : ViewModel() {
// (1) ํ๋ฉด ํ์์ฉ State
...
// (2) ViewModel์ฉ ๋ด๋ถ ๋ณ์
...
// (3) View์์ ๋ฐ์ ์ฒ๋ฆฌํ ์ด๋ฒคํธ
...
// (4) View๋ก๋ถํฐ ๋ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
...
// (5) DayMealView ์๋ ํ์ธ์ฉ ๋ก๊ทธ
fun log() {
viewModelScope.launch {
Log.i("interfacer_han", repository.getAllMeals().toString())
}
}
}
Repository์ ์ ๊ทผ ๊ฐ๋ฅํ ViewModel์ Log๋ฅผ ์ถ๋ ฅํ๋ ํจ์๋ฅผ ๋ง๋ ๋ค. ์ด ํจ์๋ฅผ ViewModel์ ์ ๊ทผ ๊ฐ๋ฅํ View์์ ํธ์ถ(#3-4 ์ฐธ์กฐ)ํ ๊ฒ์ด๋ค.
#3-4 View (NutrientScreen.kt)
...
@Composable
fun NutrientScreen(
...
) {
LaunchedEffect(key1 = true) {
// DayMealView ์๋ ํ์ธ์ฉ ๋ก๊ทธ
viewModel.log()
...
}
...
}
#4 ์์ฑ๋ ์ฑ
#4-1 ์คํฌ๋ฆฐ์ท

๋ก๊ทธ ๋ฉ์์ง๋ ์ฑ ์์๊ณผ ๋์์ ์ถ๋ ฅ๋๋ฏ๋ก, ์์ ๊ฐ์ ์ํ๋ฅผ ๋ง๋ค๊ณ ์ฑ์ ์ฌ์์ํ๋ฉด 11์ผ์ธ Meal 3๊ฐใ12์ผ์ธ Meal 2๊ฐใ13์ผ์ธ Meal 1๊ฐใ14์ผ์ธ Meal 4๊ฐ๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค (#4-2 ์ฐธ์กฐ).
#4-2 ๋ก๊ทธ ๋ฉ์์ง
[
DayMealView(
dayId=4, mealId=10, date=2024-11-14, time=07:48:11.077044, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 )
),
DayMealView(
dayId=4, mealId=9, date=2024-11-14, time=07:48:10.831407, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 )
),
DayMealView(
dayId=4, mealId=8, date=2024-11-14, time=07:48:10.634030, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 )
),
DayMealView(
dayId=4, mealId=7, date=2024-11-14, time=07:48:10.453062, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 )
),
DayMealView(
dayId=3, mealId=6, date=2024-11-13, time=07:48:09.646245, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 )
),
DayMealView(
dayId=2, mealId=5, date=2024-11-12, time=07:48:08.852377, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 ) ),
DayMealView(
dayId=2, mealId=4, date=2024-11-12, time=07:48:08.591206, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 )
),
DayMealView(
dayId=1, mealId=3, date=2024-11-11, time=07:48:07.773742, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 )
),
DayMealView(
dayId=1, mealId=2, date=2024-11-11, time=07:48:07.481481, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 )
),
DayMealView(
dayId=1, mealId=1, date=2024-11-11, time=07:48:07.159289, name=์๋ ์์ฑ๋ Meal, nutritionInfo=NutritionInfo( overeatingExcess=0, refinedSugarExcess=0, refinedGrainExcess=0, flourExcess=0, fiberQuality=0, proteinQuality=0, sodiumExcess=0 )
)
]
๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ ์ฝ๋๊ฐ ์ ์ถ๋ ฅ๋๋ค.
#4-3 ์ด ๊ฒ์๊ธ ์์ ์ Commit
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com
#4-4 ๋ณธ ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ต์ Commit
GitHub - Kanmanemone/nutri-capture-new
Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.
github.com
'๊ฐ๋ฐ ์ผ์ง ๐ป > Swemo' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Nutri Capture - ์ฑํ UI ๊ตฌ์กฐ ์ก๊ธฐ (1) | 2024.11.14 |
|---|---|
| Nutri Capture - Room ๊ฐ์ ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ํ์ํ ๋งํผ๋ง ๊ฐ์ ธ์ค๊ธฐ (0) | 2024.11.12 |
| Nutri Capture - ์ฑํ UI (2) | 2024.11.08 |
| Nutri Capture - View์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT ๋์ ํธ๋ฆฌ๊ฑฐ (0) | 2024.10.23 |
| Nutri Capture - ViewModel์ ๋ฐ์ดํฐ๋ฒ ์ด์ค Model์ ์์ฑ์ ์ฃผ์ (0) | 2024.10.23 |