본문 바로가기
프로그래밍/Flutter

[Flutter] 19. 데이터 저장 앱 만들기4, SharedPreference ID관리

by 신나요 2022. 3. 7.

플러터 앱에서 SharedPreference 패키지를 이용하여 데이터를 저장하고 읽어오는 앱을 만들고 있습니다. 계속해서 완성해 보도록 하겠습니다. 하단에 링크돼있는 연관글을 참고해서 읽어주세요.

 

이번 포스트는 다음 내용을 다루고 있습니다.

  • SharedPreferences의 ID 처리 Counter로 관리하기

현재까지 진행상황

현재까지 만든 앱은 새 기록을 앱에 쓸 때 하드 코딩된 같은 ID로 넣고 있습니다. 그래서 계속 같은 ID로 입력하게 되어 하나의 데이터밖에 쓰고 볼 수 없는 상태입니다.

데이터 베이스에 넣을 때는 ID를 자동으로 처리할 수 있지만 SharedPreferences의 경우 수동으로 처리해야 합니다.


SharedPreferences ID처리 Counter로 관리하기

ID 카운터 만들기

유저가 SharedPreferences에 새 기록을 추가할 때마다 증가하는 카운터를 저장해서 ID관리를 해보겠습니다.

setCounter, getCounter

setCounter와 getCounter를 SharedPreference 헬퍼클래스인 SPHelper 클래스에 추가했습니다.

(1) setCounter 메소드는 쓰기 처리가 필요하므로 비동식 메소드로 만들고 있습니다.

(2) "counter"라는 키로 값을 가져왔을 때 null 이면 아직 값이 기록되지 않았음을 의미하고 0을 설정해줍니다.

(3) 카운터를 1씩 증가시킵니다.

(4) 다시 "counter"라는 키 이름으로 1 증가된 카운터를 앱에 기록합니다.

(5) 읽기 처리인 getCounter 메소드는 비동기식이 아닙니다. 단순히 counter의 타입인 int를 리턴해줍니다.

(6) getInt 메소드를 키로 호출해 앱에 저장된 값을 반환받고 null 이면 0을 반환합니다.

이 카운터를 이제 독서 트레이닝 화면에서 책 읽기 기록 정보를 쓰거나 읽을 때 사용하도록 하겠습니다.

 

ID 카운터 이용하기

savePerformance 메서드는 PerformanceScreen 화면에서 AlertDialog 의 save 버튼을 눌렀을 때 호출되는 메소드이며 SPHelper를 이용해 값을 쓰는 처리가 이루어지는 곳입니다. 이제 이곳에서 하드코딩된 id 대신에 방금 만든 getCounter를 이용하도록 수정하겠습니다.

savePerformace 메소드에서 id를 선언하고 getCounter를 호출한 값에 1을 더해줍니다. 그런 다음 performance 객체를 만들 때 하드코딩된 값 대신 이 id를 매개변수로 넣어주었습니다. writePerformance 메소드가 반환된 후 에는 then 콜백에서 updateScreen을 호출하여 화면을 갱신해주고 helper.setCounter 매소드도 호출하여 카운터를 업데이트합니다.

 

마지막으로 한 가지 수정사항이 더 있습니다. SPHelper클래스의 getPerformance 메소드에서 performance 를 가져올 때  모든 키를 취득 후 performance를 생성하여 가져오고 있는데 키가 "counter"일때는 객체 생성을 제외시켜야 합니다.

간단히 if문에서 key가 counter인지 체크를 한 후 객체 생성을 하도록 바꾸었습니다.

 

목표로 했던 작업이 다 끝났습니다. 앱 화면에서 확인해 보도록 하겠습니다.

ID가 중복되지 않아 여러 기록을 저장할 수 있게 되었습니다.

전체 SPHelper의 클래스의 전체 코드는 다음과 같습니다.

import 'package:shared_preferences/shared_preferences.dart';
import 'performance.dart';
import 'dart:convert';

class SPHelper {
  static late SharedPreferences prefs;

  Future init() async {
    prefs = await SharedPreferences.getInstance();
  }

  Future writePerformance(Performance performance) async {
    prefs.setString(
        performance.id.toString(), json.encode(performance.toJson()));
  }

  List<Performance> getPerformances() {
    List<Performance> performances = [];
    Set<String> keys = prefs.getKeys();
    keys.forEach((String key) {
      if (key != 'counter') {
        Performance performance =
            Performance.fromJson(json.decode(prefs.getString(key) ?? ''));
        performances.add(performance);
      }
    });
    return performances;
  }

  Future setCounter() async {
    int counter = prefs.getInt('counter') ?? 0;
    counter++;
    await prefs.setInt('counter', counter);
  }

  int getCounter() {
    return prefs.getInt('counter') ?? 0;
  }
}

여기까지 수고하셨습니다. 화면이 거의 완성이 된 것 같습니다. 다음 포스트에서 독서 트레이닝 마지막 기능인 삭제 기능을 추가해 보도록 하겠습니다.

 

연관글

16. 플러터 데이터 저장 앱 만들기1 (SharedPreferences 헬퍼 클래스, FloatingActionButton 위젯)

17. 플러터 데이터 저장 앱 만들기2 (AlertDialog 다이얼로그 위젯 입력 받기)

18. 데이터 저장 앱 만들기3, 데이터 읽기, ListTile 위젯

댓글