1. 왜 지워도 다시 나왔나
예전 「예시 데이터만 지우기」는 sync_uid가 demo-로 시작하는 줄만 하드 삭제했다.
-
반복 예시를 완료하거나, 지난 반복 일정을 떼어 내면 새 줄이 생긴다.
그 줄의
sync_uid는genUuid()라서demo-가 없다. 지우기 뒤에 달력에 남는다. -
직접 넣은 할일·일정·기록도
demo-가 아니면 그대로 남는다. 화면의 「취침」「기록」「친구」「할일」이 이 경우다. -
할일 행이 0개가 되면
main()의DemoSeed.installIfNoTodos()가 앱을 다시 열 때 예시를 자동으로 다시 넣는다.
물 2리터 마시기 등)만 추가로 지우는 방식은 쓰지 않는다.
버튼은 공휴일을 제외한 할일·일정·기록을 모두 지운다.
2. 최종 규칙
설정 버튼 이름은 예시 데이터 지우기다. 「만」을 빼는 것이 문구 변경의 전부는 아니고, 지우는 범위가 바뀐다.
| 대상 | 버튼을 누르면 |
|---|---|
현재 사용자의 tb_todo (할일·일정·기록, demo- 여부 무관) |
하드 삭제 |
tb_record_template (기록 종류) |
하드 삭제 |
공휴일 이름 (assets/holidays.json) |
그대로. 파일도 코드도 지우지 않는다 |
공휴일 메모 (tb_holiday_memo) |
그대로 |
| 구글 캘린더 구독 URL (설정값) | 그대로. 구독 일정은 달력에 남을 수 있다 |
| 미리 알림 | NotifyService.syncFromDb()로 남은 일정만 다시 맞춘다 |
| 다음 실행 때 예시 자동 삽입 | 하지 않는다. 설정 demo_skip_autoload=1 |
「예시 데이터 넣기」는 이전과 같다.
이미 있는 demo- 줄만 정리하고 오늘 기준으로 다시 넣으며, 그때
demo_skip_autoload를 0으로 돌려 자동 삽입 금지를 푼다.
3. lib/db/app_db.dart
아이폰에는 반영됨. 안드로이드의 같은 파일에 아래만 추가·교체한다.
3-1. 갈라진 회차도 demo- 유지
demoUidPrefix 바로 아래에 둔다.
「예시 데이터 넣기」가 demo-만 정리할 때, 완료·지난 회차가 빠지지 않게 한다.
지우기 버튼 자체는 이 접두어를 보지 않고 통째로 지운다.
static const demoUidPrefix = 'demo-';
/// 예시 항목에서 갈라진 회차도 demo- 를 유지한다.
static String childSyncUid(String? parentUid) {
if (parentUid != null && parentUid.startsWith(demoUidPrefix)) {
return '$demoUidPrefix${genUuid()}';
}
return genUuid();
}
새 줄을 만드는 세 곳에서 genUuid() 대신 이 함수를 쓴다. 부모의 sync_uid를 넘긴다.
| 함수 | 바꿀 식 |
|---|---|
detachPastRepeatEvent — 지난 반복 일정을 단일 일정으로 떼어 낼 때 |
..['sync_uid'] = AppDb.childSyncUid(base.syncUid) |
completeRepeatOccurrence — 반복 회차 하나만 완료 기록으로 넣을 때 |
syncUid: AppDb.childSyncUid(base.syncUid), |
_rollForwardImpl — 완료된 반복 할일의 다음 회차 행 |
..['sync_uid'] = AppDb.childSyncUid(t.syncUid) |
insert / update에서 비어 있는 sync_uid를 채우는
genUuid()는 그대로 둔다. 사용자가 직접 만든 항목이다.
3-2. 공휴일만 남기는 삭제
deleteDemoData는 「예시 데이터 넣기」가 기존 demo-를 정리할 때 그대로 쓴다.
지우기 버튼은 아래 함수를 호출한다. deleteDemoData 바로 다음에 추가한다.
/// 공휴일(이름·메모)은 두고, 할일·일정·기록과 기록 종류를 모두 하드 삭제.
Future<int> deleteAllExceptHolidays() async {
final d = await db;
final u = await currentUser();
var n = 0;
n += await d.delete('tb_todo', where: 'user_id = ?', whereArgs: [u]);
n += await d.delete('tb_record_template');
return n;
}
tb_holiday_memo와 tb_setting의 구글 캘린더 URL은 DELETE 하지 않는다.
tb_record_template은 이 앱에서 사용자 컬럼이 없어 테이블 행을 모두 지운다.
4. lib/logic/demo_seed.dart
4-1. 자동으로 다시 넣지 않기
클래스 안에 키를 둔다.
static const _skipAutoloadKey = 'demo_skip_autoload';
installIfNoTodos 맨 앞에서 설정이 1이면 삽입하지 않고 돌아간다. main()이 이 함수를 앱 시작 때 호출한다.
static Future<void> installIfNoTodos() async {
final db = AppDb.instance;
if (await db.getSetting(_skipAutoloadKey) == '1') {
await _fixCreatedAfterDue();
return;
}
// 아래는 기존: 미삭제 할일이 0이면 insertDemoData()
}
4-2. 넣기 후에는 자동 삽입 금지를 푼다
insertDemoData 끝, bumpData() 바로 앞에 한 줄.
await db.setSetting(_skipAutoloadKey, '0');
bumpData();
4-3. 지우기
clearDemoData 전체를 아래로 바꾼다. notify.dart를 import 한다.
import '../services/notify.dart';
/// 공휴일은 남기고 할일·일정·기록·기록 종류를 모두 지운다.
/// 다시 실행해도 예시가 자동으로 들어가지 않는다.
static Future<void> clearDemoData() async {
final db = AppDb.instance;
await db.deleteAllExceptHolidays();
await db.setSetting(_skipAutoloadKey, '1');
await NotifyService.instance.syncFromDb();
bumpData();
}
syncFromDb는 알림 플러그인이 준비되지 않았으면 바로 return 한다.
지운 항목의 미리 알림이 남지 않게, 남아 있는 일정만 다시 예약한다.
5. lib/screens/settings_screen.dart 문구
동작은 기존 _clearDemo → DemoSeed.clearDemoData() 를 유지하고, 보이는 글만 바꾼다.
| 위치 | 글 |
|---|---|
| 안내 문장 | 「예시 데이터 지우기」는 공휴일은 남기고 할일·일정·기록을 모두 지웁니다. |
| 버튼 | 예시 데이터 지우기 |
| 확인 | 예시 데이터를 지울까요? / 공휴일은 남고, 할일·일정·기록은 모두 지워집니다. |
| 완료 스낵바 | 예시 데이터를 지웠습니다. 공휴일만 남습니다. |
label: const Text('예시 데이터 지우기'),
final ok = await showAppConfirm(
context, '예시 데이터를 지울까요?\n공휴일은 남고, 할일·일정·기록은 모두 지워집니다.');
_snack('예시 데이터를 지웠습니다. 공휴일만 남습니다.');
6. 건드리지 말 것
assets/holidays.json, 공휴일 빨강 표시,tb_holiday_memo.- 구글 캘린더
.icsURL 설정. 구독 일정은 로컬tb_todo가 아니라서 버튼으로 안 지워진다. deleteDemoData의demo-정리. 「예시 데이터 넣기」가 여전히 호출한다.기상·취침·걷기·혈압약을 제목만으로 따로 지우는 분기. 통째 삭제라 필요 없다.
7. 확인
- 앱을 다시 실행한다. 이미 켜 둔 프로세스는 이전 버튼을 유지한다.
- 설정에 예시 데이터 지우기가 보인다.
- 누르면 달력의 할일·일정·기록 칸이 비고, 추석 같은 공휴일 이름만 남는다.
- 앱을 종료했다가 다시 열어도 예시가 자동으로 채워지지 않는다.
- 「예시 데이터 넣기」를 누르면 오늘 기준 예시가 다시 들어간다.
아이폰에서 flutter analyze는 이 세 파일에 이슈가 없었고, test/demo_uid_test.dart의 childSyncUid 테스트는 통과했다.