일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Excel
- web track
- androidId
- uint16array
- Prism.js
- Raycasting
- babel
- KakaoMap
- Game js
- Completer
- Redux
- REST API
- webrtc
- jszip
- uint8array
- react
- Three-fiber
- Three js
- code editor
- identifierForVender
- FirebaseAnalytics
- Babel standalone
- node
- typescript
- methodChannel
- RouteObserver
- Flutter
- Image Resize typescript
- userevent_tracker
- swagger-typescript-api
- Today
- Total
Never give up
Flutter - Store List in SQFLite 본문
앱개발을 하다보면 List를 DB에 저장해야할 때가 있습니다
List<String>같은 경우 SharedPreferences에 저장하는 방법도 있지만
key값을 갖는 Map같은 경우 ex) Map<Key, List<DataType>>
SQFLite를 통해 DB에 저장하거나 Batch파일에 저장해야됩니다
여기에서는 SQFLite를 통해 저장하는 방법을 알아보겠습니다
먼저 제가 사용한 데이터 타입은 Map<DateTime, List<String>>입니다
void setTodayData(DateTime time, List<String> list) async {
//Map<DateTime, List<String>> _map = {};
//_map[time] = list;
//notifyListeners();
//윗 부분은 UI에 표시하는 부분이어서 다른형태로 사용하셔도 무방합니다
String data = jsonEncode(list);
//DBManager _manager = DBManager();
await _manager.setStatus(time.millisecondsSinceEpoch, data);
}
1. _map에 key(DateTime)값과 value(List<String>)값 저장
2. List는 json형태로 변환
3. DB에 DateTime의 int값 그리고 변환된 json의 String값을 전달
setTodayData(
DateTime(tempTime.year, tempTime.month, tempTime.day),
getCheckedItems());
(필자가 필요한 형태는 연, 월, 일이어서 다음과 같이 저장)
List<String> getCheckedItems() {
List<String> list = [];
for (int i = 0; i < getItemLength; i++) {
if (_items[i].getCheckbox) { //checkbox value가 true인 경우에 리스트에 추가
list.add(_items[i].title);
}
}
return list;
}
DB클래스
Table 구조
Future<void> _onCreate(Database db, int version) async {
await db.execute('CREATE TABLE $statusTable(date INTEGER, list TEXT)');
}
저장할 때
Future<int> setStatus(int date, String list) async {
var database = await _openDB();
int insert = await database.rawInsert(
'INSERT INTO $statusTable(date, list) VALUES (?, ?)', [date, list]);
return insert;
}
(int 값과 String값을 각각 INTEGER, TEXT에 저장하는 것은 어렵지 않기에 설명 생략합니다)
불러올 때
Future<Map<DateTime, List<String>>> getStatus() async {
var database = await _openDB();
List<Map> rawList = await database.rawQuery('SELECT * FROM $statusTable');
return Map.fromIterable(rawList,
key: (value) => DateTime.fromMillisecondsSinceEpoch(value['date']),
value: (value) => List<String>.from(jsonDecode(value['list'])));
}
마지막으로 불러올때가 조금 까다로운데
전에 List<Map> to Map or List 부분과 동일한 방법을 사용합니다
(https://devmemory.tistory.com/14)
List<Map>을 제가 필요한 형태인 Map<DateTime, List<String>>으로 가져올 때
먼저 key값은 DB에 int형태로 변환된 값을 불러오기 때문에
DateTime.fromMillisecondsSinceEpoch()를 통해 DateTime으로 변환을 해주고
value값을 가져올 때에는 json형태의 String값이 들어가 있으니
jsonDecode를 통해 iterable형태로 변환해주고
List<String>.from을 통해 List<String>으로 변환해줍니다
마지막으로 List<DataType> 다른 형태의 데이터 타입을 사용하게 되면
조금 더 복잡한 방법을 통해 변환을 해야될거 같습니다
'Flutter' 카테고리의 다른 글
Flutter - Map get key by value (0) | 2020.09.04 |
---|---|
Flutter - ReorderableListView (0) | 2020.08.12 |
Flutter - Scale example with GestureDetector (0) | 2020.08.05 |
Flutter - Provider Consumer and Selector (0) | 2020.08.03 |
Flutter - List<Map> to Map or List with SQFLite (0) | 2020.08.03 |