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> 다른 형태의 데이터 타입을 사용하게 되면
조금 더 복잡한 방법을 통해 변환을 해야될거 같습니다