DB 없이 데이터 저장하는 방법 (Shared Preferences)
- 우선 데이터를 보존하는 방법으로는 몇 가지가 있는데
- 첫 째는 가장 기본적인 방법으로 서버로 보내서 DB에 저장하기
- 둘 째는 폰 메모리카드에 저장하는 방법으로 Shared Preferences 가 된다.
- 그래서 따로 데이터, 캐시를 삭제하지 않으면 영구 보관이 가능하다.
- 그래서 보통 중요한건 DB에 저장, 아니면 Shared Preferences 로 저장!
- Shared Preferences 설치 셋팅
- pubspec.yaml에 아래의 코드 추가하기
dependencies:
flutter:
sdk: flutter
http: ^0.13.4
image_picker: ^0.8.4+4
shared_preferences: ^2.0.11
- main.dart에 설치한거 불러오기
// shared_preferences
import 'dart:convert'; // <- 이건 있으면 안해도 됨
import 'package:shared_preferences/shared_preferences.dart'
- Shared Preferences 사용
- 저장하기
- 비동기 통신으로 해야하기에 async, await을 사용하기
- 변수에 SharedPreferences.*getInstance*() 를 담은 다음 변수.setString()으로 담아주기
- setString으로는 key, value 값으로 (’이름’, ‘데이터’)를 담아주면 된다.
- 여기서 저장하는 함수가 다양하다
- .setString()
- .setBool()
- .setInt()
- .setDouble()
- .setStringList()
- 사용하기
- getString()으로 가져올 데이터 이름을 작성후 실행
- 아니면 get()으로만 해도 된다.
- 다만 정확하게 데이터를 꺼내고 싶다면
- .getString()
- .getBool() … 이런식으로 작성해야 한다.
saveData() async{ var storage = await SharedPreferences.getInstance(); storage.setString('이름', 'hminor'); var data = storage.get('이름') // hminor }
- 삭제하기
- .remove(’이름’)
- 이외 특수 케이스
- map자료(Object) 저장
- 따로 map 자료를 저장하는 방법이 없기에 setString()에 데이터의 값을 JSON 형태로 jsonEncode()로 변형 후 저장하고 사용시엔 jsonDecode()로 변형 후 사용하기
var map = {'name': 'ki'}; var storage = await SharedPreferences.getInstance(); storage.setString('map', jsonEncode(map)); // <- 저장 storage.get('map')
- 다만 위의 코드처럼 작성하게 되면 에러가 발생하게 되는데
- 이유는 가져오는 타입이 문자인지 아닌지 알 수 없는 Object 형태이기 때문
- 그래서 getString으로 정확하게 작성해주는 것이 더욱 좋은 방법!
var map = {'name': 'ki'}; var storage = await SharedPreferences.getInstance(); storage.setString('map', jsonEncode(map)); // <- 저장 storage.getString('map')
- 그리고 이렇게 작성을 해도 아직 확실하게 문자인지 알 수 없다고 에러가 발생한다.
- 그래서 조건문을 활용해서 데이터가 없다면 담아줄 문자를 작성해주어 해결!
var map = {'name': 'ki'}; var storage = await SharedPreferences.getInstance(); storage.setString('이름', jsonEncode(map)); var result = storage.getString('이름')??'데이터가 없다.'; print(jsonDecode(result)['name']);
- map자료(Object) 저장
- 저장하기
- 그래서 Shared Preferences를 사용하는 용도로
- 인스타그램을 예시로 들 수 있다.
- 한 번 본 게시글은 빠르게 렌더링이 되는데 이유는
- 폰 메모리에 저장해뒀기 때문이다.
- 장점
- 빠른 로드
- 서버 부하 감소
- 단점
- 이미지를 저장할 수 없다
- 보안 방법
- cached_network_image를 사용하면 이미지를 폰에 저장할 수 있다.
- https://pub.dev/packages/cached_network_image
- 보안 방법
- 이미지를 저장할 수 없다
- 인스타그램을 예시로 들 수 있다.
'Flutter' 카테고리의 다른 글
[Flutter] Provider 사용하기 (0) | 2023.08.13 |
---|---|
[Flutter] GestureDetector & 페이지 전환 애니메이션 (CupertinoPageRoute,PageRouteBuilder) (0) | 2023.08.12 |
[Flutter] 폰에 저장된 이미지 가져오기 (Image Picker) (0) | 2023.08.11 |
[Flutter] 상세페이지 만들기 (Navigator, Routes) (0) | 2023.08.10 |
[Flutter] 스크롤 위치 파악 & 무한 스크롤 (0) | 2023.08.10 |