SQLite를 이용할때 문제의 진행을 각 난이도별로 공유하는 문제 해결법

레벨과 퀴즈 그룹을 기본 키로 설정하여 데이터 충돌 방지

레벨과 퀴즈 그룹을 기본 키로 설정하여 데이터 충돌 방지

문제점

기존에는 레벨과 퀴즈 그룹이 정확히 구별되지 않아 새로운 진행도를 저장할 때 기존 데이터가 덮어씌워지는 문제가 있었습니다.

해결 방법

progress 테이블의 기본 키를 levelquizGroup의 조합으로 설정하여, 레벨별로 진행도를 독립적으로 관리하도록 변경하였습니다.

CREATE TABLE IF NOT EXISTS progress (
    level TEXT,
    quizGroup TEXT,
    lastQuestionIndex INTEGER,
    PRIMARY KEY (level, quizGroup)
);

데이터 저장 방식 개선

업데이트 시 특정 레벨과 그룹에 대해서만 진행도 변경

saveProgress 메서드에서 WHERE 절에 levelquizGroup을 포함하여 특정 레벨과 그룹에 대해서만 진행도를 변경하도록 설정하였습니다.

let updateQuery = "UPDATE progress SET lastQuestionIndex = ? WHERE level = ? AND quizGroup = ?;"

진행도 조회 시 정확한 필터링 적용

let selectQuery = "SELECT lastQuestionIndex FROM progress WHERE level = ? AND quizGroup = ?;"

변경된 데이터가 없으면 새로운 데이터를 삽입하는 UPSERT 패턴 사용

if sqlite3_changes(db) == 0 {
    insertProgress(level: level, quizGroup: quizGroup, index: index)
}

결과 및 개선점

  • 레벨별로 진행도를 독립적으로 관리할 수 있어, 예를 들어 N1에서 3번 문제까지 진행했더라도 N2에서는 처음부터 시작할 수 있음.
  • 데이터가 덮어씌워지지 않고, 특정 레벨과 그룹에 대해 정확하게 저장됨.
  • 업데이트와 삽입을 분리하여 데이터 일관성 유지 및 예기치 않은 데이터 덮어씌우기 방지.

댓글

이 블로그의 인기 게시물

비주얼 스튜디오 코드에서 깃허브에 프로젝트 올리는 법

Git rebase Github에 다시 프로젝트 올리기

React Native 앱에서 ProGuard 난독화 설정