현재 추가버튼을 누르면 WorkoutSetInfo라는 아이템이 리스트에 추가되고 (DB에 Insert 하지않음)
다 추가되면 저장버튼을 눌러 Workout과 함께 WorkoutSetInfo리스트가 함께 DB에 Insert 시키는 것을 만들고 있습니다.
어느정도 되긴했는데.. 위에서도 언급했다시피 Workout과 WorkoutSetInfo 리스트 정보가 최종적으로 마지막에 저장버튼을 눌렀을때 한번에 넣는 식이다 보니
자식 Entity(WorkoutSetInfo)에서 부모 Entity(Workout)을 참조하기위핸 ForeignKey의 세팅을 어떻게 설정(가져와야)할지 모르겠습니다..
현재는 test한다고 고정값 1로 설정해놓았는데
Workout이 추가될때마다 Workout의 값은 달라지는데 이게 고정 1이 될순 없잖아요?
그래서 workoutId를 가져와서 WorkoutSetInfo를 생성할때 파라미터로 줘봤는데 에러가나더군요..
FOREIGN KEY constraint failed (code 787 SQLITE_CONSTRAINT_FOREIGNKEY[787])
에러요.. 검색해보니 부모테이블에 존재하지않은 외래키를 추가해서 이런 에러가 발생하는것같다는데..
어떻게 해결해야좋을까요
Workout
@Entity
data class Workout(
@PrimaryKey(autoGenerate = true)
val workoutId: Long = 0,
val title: String = "",
var unit: String = "kg",
val memo: String = "",
)
WorkoutSetInfo
@Entity(
foreignKeys = [
ForeignKey(
entity = Workout::class,
parentColumns = arrayOf("workoutId"),
childColumns = arrayOf("parentWorkoutId"),
onDelete = ForeignKey.CASCADE // 부모가 삭제될때 자식도 전부삭제 옵션
)
]
)
data class WorkoutSetInfo(
@PrimaryKey(autoGenerate = true)
val id: Long = 0, // UUID 비교를 위한 ID
val set: Int,
var weight: String = "",
var reps: String = "",
val parentWorkoutId: Long
)
WorkoutWithSets
data class WorkoutWithSets(
@Embedded val workout: Workout,
@Relation (
parentColumn = "workoutId" ,
entityColumn = "parentWorkoutId"
)
val sets: List<WorkoutSetInfo>
)
Repository
class WorkoutRepository(private val workoutDao : WorkoutDao, title: String) {
val workout = Workout(title = title)
private val setInfoList = ArrayList<WorkoutSetInfo>()
fun add() {
val item = WorkoutSetInfo(set = setInfoList.size + 1, parentWorkoutId = workout.workoutId)
setInfoList.add(item)
}
fun save() {
workoutDao.insertWorkout(workout)
workoutDao.insertSetInfoList(setInfoList)
}
// toList를 하는 이유는 새로운 리스트를 반환하기때문에 postValue 가능하게끔 하기 위함
fun getList() : List<WorkoutSetInfo> = setInfoList.toList()
}