플러터:데이터 저장(간단한 데이터): 두 판 사이의 차이
보이기
| (같은 사용자의 중간 판 5개는 보이지 않습니다) | |||
| 4번째 줄: | 4번째 줄: | ||
Flutter에서 화면을 이동하거나 앱을 재시작해도 데이터를 유지하려면 상태 관리와 로컬 저장 방법을 이해해야 한다. | Flutter에서 화면을 이동하거나 앱을 재시작해도 데이터를 유지하려면 상태 관리와 로컬 저장 방법을 이해해야 한다. | ||
이 문서에선 Hive를 이용한 로컬 DB 기반 데이터 저장에 대해 다룬다. | |||
=== | SharedPreferences 등 '키:값' 방식의 간단한 저장방식도 있지만, 규모가 조금만 커져도 DB 저장방식에 밀린다. | ||
=== Hive의 특징 === | |||
* 매우 빠름 (binary 기반) | |||
* 리스트, Map, 객체까지 저장 가능(클래스 형태도 저장) | |||
* 오프라인 DB 역할 수행 | |||
* iOS/Android 모두 지원 | |||
* 수백~수천 개 데이터 저장해도 빠름 | |||
=== Hive 저장 위치 === | |||
{| class="wikitable" | {| class="wikitable" | ||
|+ | |+ | ||
| 13번째 줄: | 22번째 줄: | ||
!비고 | !비고 | ||
|- | |- | ||
| | |안드로이드 | ||
|/data/data/<패키지명>/ | |/data/data/'''<패키지명>'''/files/hive/ | ||
| | | | ||
* | * 앱만 접근 가능 | ||
* | * 파일 앱에서 보이지 않음 | ||
* | * 앱 삭제 시 데이터도 삭제됨 | ||
* | * 앱 종료/재부팅해도 유지됨 | ||
|- | |- | ||
|iOS | |iOS | ||
| | |Application/<UUID>/Documents/hive/ | ||
(앱 UUID는 설치할 때마다 달라짐) | |||
| | | | ||
* 앱 내부 전용 저장 공간 | * 앱 내부 전용 저장 공간 | ||
| 28번째 줄: | 38번째 줄: | ||
* 앱 삭제 시 같이 삭제 | * 앱 삭제 시 같이 삭제 | ||
|- | |- | ||
| | |Windows | ||
| | |%APPDATA%\<앱폴더>\hive | ||
| | |예시: C:\Users\<사용자>\AppData\Roaming\com.example.myapp\hive\ | ||
|- | |||
|브라우저 | |||
|파일이 아닌, IndexedDB 내부에 저장됨. | |||
(Chrome 기준: 개발자도구 → Application → IndexedDB) | |||
F5 눌러도 저장된 값이 그대로 유지된다. | |||
|(dart에서 작성한 <code>box</code>, <code>decibelBox</code> 등이 그대로 DB 이름이 됨) | |||
|} | |} | ||
== | == Hive로 데이터 유지하기 == | ||
=== 준비 === | |||
pubspec.yaml 설정<syntaxhighlight lang="yaml">dependencies: | |||
hive: ^2.2.3 | |||
hive_flutter: ^1.1.0</syntaxhighlight>파일 변경 이후 flutter pub get | |||
=== 전체 코드 === | |||
가장 기본 예제인 카운팅 앱을 변형한 것. | |||
참고: 브라우저로 실행하면 켤 때마다 다른 port로 실행되는데, 이는 전혀 다른 웹페이지를 연 것으로 인식되어 저장된 데이터를 사용하지 못한다. 다만, f5로 초기화 하면 기존 코드에선 카운팅이 0부터 시작되었던 반면, Hive를 쓴 경우 저장되어 있던 숫자 그대로 활용할 수 있다.<syntaxhighlight lang="dart">import 'package:flutter/material.dart'; | |||
<syntaxhighlight lang=" | import 'package:hive_flutter/hive_flutter.dart'; | ||
void main() async { | |||
</ | WidgetsFlutterBinding.ensureInitialized(); | ||
await Hive.initFlutter(); | |||
await Hive.openBox('box'); // 'box'라는 이름으로 열기. Hive의 Box는 작은 데이터베이스 하나라고 생각하면 됨. | |||
runApp(MyApp()); | |||
} | |||
class MyApp extends StatefulWidget { | |||
@override | |||
State<MyApp> createState() => _MyAppState(); | |||
} | |||
class _MyAppState extends State<MyApp> { | |||
final box = Hive.box('box'); | |||
int count = 0; | |||
@override | |||
void initState() { // 앱 시작 시 초기화 | |||
super.initState(); | |||
count = box.get('count', defaultValue: 0); // 저장된 값 불러오기 | |||
} | |||
void increase() { | |||
setState(() { | |||
count++; | |||
box.put('count', count); // 저장 | |||
}); | |||
} | |||
@override | |||
Widget build(BuildContext context) { | |||
return MaterialApp( | |||
home: Scaffold( | |||
appBar: AppBar(title: Text("Hive 초간단 예제")), | |||
body: Center(child: Text("$count", style: TextStyle(fontSize: 40))), | |||
floatingActionButton: FloatingActionButton( | |||
onPressed: increase, | |||
child: Icon(Icons.add), | |||
), | |||
), | |||
); | |||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
2026년 1월 7일 (수) 02:58 기준 최신판
- 플러터:개요
- 플러터:실행
- 플러터:개념 잡기
- 권한 사용
- 위젯
- 플러터:DB연결
- 플러터:Firebase(미완)
- 플러터:MySQL(미완)
- 디자인
- 플러터:배포
- 플러터:참고자료
- 플러터:위젯
- 플러터:라이브러리
Flutter에서 화면을 이동하거나 앱을 재시작해도 데이터를 유지하려면 상태 관리와 로컬 저장 방법을 이해해야 한다.
이 문서에선 Hive를 이용한 로컬 DB 기반 데이터 저장에 대해 다룬다.
SharedPreferences 등 '키:값' 방식의 간단한 저장방식도 있지만, 규모가 조금만 커져도 DB 저장방식에 밀린다.
- 매우 빠름 (binary 기반)
- 리스트, Map, 객체까지 저장 가능(클래스 형태도 저장)
- 오프라인 DB 역할 수행
- iOS/Android 모두 지원
- 수백~수천 개 데이터 저장해도 빠름
| 운영체제 | 설명 | 비고 |
|---|---|---|
| 안드로이드 | /data/data/<패키지명>/files/hive/ |
|
| iOS | Application/<UUID>/Documents/hive/
(앱 UUID는 설치할 때마다 달라짐) |
|
| Windows | %APPDATA%\<앱폴더>\hive | 예시: C:\Users\<사용자>\AppData\Roaming\com.example.myapp\hive\ |
| 브라우저 | 파일이 아닌, IndexedDB 내부에 저장됨.
(Chrome 기준: 개발자도구 → Application → IndexedDB) F5 눌러도 저장된 값이 그대로 유지된다. |
(dart에서 작성한 box, decibelBox 등이 그대로 DB 이름이 됨)
|
pubspec.yaml 설정
dependencies:
hive: ^2.2.3
hive_flutter: ^1.1.0
파일 변경 이후 flutter pub get
가장 기본 예제인 카운팅 앱을 변형한 것.
참고: 브라우저로 실행하면 켤 때마다 다른 port로 실행되는데, 이는 전혀 다른 웹페이지를 연 것으로 인식되어 저장된 데이터를 사용하지 못한다. 다만, f5로 초기화 하면 기존 코드에선 카운팅이 0부터 시작되었던 반면, Hive를 쓴 경우 저장되어 있던 숫자 그대로 활용할 수 있다.
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
await Hive.openBox('box'); // 'box'라는 이름으로 열기. Hive의 Box는 작은 데이터베이스 하나라고 생각하면 됨.
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final box = Hive.box('box');
int count = 0;
@override
void initState() { // 앱 시작 시 초기화
super.initState();
count = box.get('count', defaultValue: 0); // 저장된 값 불러오기
}
void increase() {
setState(() {
count++;
box.put('count', count); // 저장
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("Hive 초간단 예제")),
body: Center(child: Text("$count", style: TextStyle(fontSize: 40))),
floatingActionButton: FloatingActionButton(
onPressed: increase,
child: Icon(Icons.add),
),
),
);
}
}