Never give up

Flutter - List<Map> to Map or List with SQFLite 본문

Flutter

Flutter - List<Map> to Map or List with SQFLite

대기만성 개발자 2020. 8. 3. 16:49
반응형

공식문서에 따르면 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를 통해 간단히 표현할 수 있습니다

반응형
Comments