Never give up

Flutter - Store List in SQFLite 본문

Flutter

Flutter - Store List in SQFLite

대기만성 개발자 2020. 8. 7. 14:04
반응형

앱개발을 하다보면 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> 다른 형태의 데이터 타입을 사용하게 되면

 

조금 더 복잡한 방법을 통해 변환을 해야될거 같습니다

반응형
Comments