Flutter - List<Map> to Map or List with SQFLite
공식문서에 따르면 SQFLite에 데이터를 저장하고 불러올 때 Data type은 다음과 같습니다
// Get the records
List<Map> list = await database.rawQuery('SELECT * FROM Test');
List<Map> expectedList = [
{'name': 'updated name', 'id': 1, 'value': 9876, 'num': 456.789},
{'name': 'another name', 'id': 2, 'value': 12345678, 'num': 3.1416}
];
(출처 : pub.dev/packages/sqflite)
먼저 Map은 key와 value의 관계로 되어있고, List는 index와 value의 관계로 되어있습니다
그리고 List<Map>은 value 값이 Map형태인 List타입 입니다
List<Map>를 그대로 사용하기에는 까다로운 부분이 있습니다
예를들어 expectedList[index] 이런식으로 부르게 되면
index 대칭되는 value값을 사용하기에는 용이하겠지만
key값 혹은 index를 찾는것은 까다롭기 때문에 Map이나 List 형태로 가져올 필요가 있습니다
그래서 List<Map>을 Map 혹은 List형태로 불러올 때는 어떻게 처리하는지 알아보겠습니다
1. List<Map> to Map
Future<Map<DateTime, int>> 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) => value['percent']);
}
원하는 데이터 형은 Map<DateTime, int>이고 불러온 rawList는 List<Map>타입입니다
다른방법도 있겠지만 필자는 Map.fromIterable(iterable, key, value)을 통해 해결했습니다
2. List<Map> to List
Future<List<MyTask>> getAll() async {
var database = await _openDB();
List<Map> rawList = await database.rawQuery('SELECT * FROM $selectedTable');
return List.generate(
rawList.length,
(index) =>
MyTask(
title: rawList[index]['title'],
checkbox: rawList[index]['checkbox']));
}
먼저 MyTask는 title(String), checkbox(int)로 구성된 클래스입니다
List는 앞서 말씀드린대로 index와 value로 이루어져있는데
length 메소드로 크기를 정의 해주고, index에 해당되는 title, checkbox값을
List.generate를 통해 간단히 표현할 수 있습니다