Never give up

Flutter - When you store collection in cloud firestore 본문

Flutter

Flutter - When you store collection in cloud firestore

대기만성 개발자 2020. 12. 23. 00:52
반응형

cloud firestore에 변수나 collection을 add하거나 set하는것은 간단합니다

 

예를들어보면

FirebaseFirestore.instance.collection('name').doc('docName').set({
a: a //int, String, bool, etc
b: [a, b] //List<String>
c: {'a': 'b'} //Map<String, String> 
}).catchError(//에러 처리);

이런식으로 set이나 add가 가능합니다

 

따로 variable을 만들어서 저장해도 문제가 없습니다

 

다만 몇가지 생각해봐야될 것이 있습니다

 

먼저 데이터 타입이 List<DataType>일 경우에는 어떻게 처리해야 될까요?

 

필자는 이전에 jsonSerialize예제에서 사용한 방법을 사용해서 처리해봤는데 다행이도 잘 동작하더군요

(예제 링크: devmemory.tistory.com/27)

 

먼저 사용하는 데이터 타입을 fromJson, toJson을 이용해서 쉽게 처리할 수 있게 만들고

const String userKey = 'user';
const String messageKey = 'message';
const String timeKey = 'time';

class ExampleItem {
  String user, message;
  int time;

  ExampleItem({this.user, this.message, this.time});

  String get getTime =>
      DateFormat('yy.MM.d').format(DateTime.fromMillisecondsSinceEpoch(time));

  factory ExampleItem.fromJson(Map<String, dynamic> json) => ExampleItem(
      user: json[userKey],
      message: json[messageKey],
      time: json[timeKey]);

  Map<String, dynamic> toJson() =>
      {userKey: user, messageKey: message, timeKey: time};
}

 

그 후 set 동작에서는 다음과 같이 처리하고

FirebaseFirestore.instance.collection('name').doc('docName').set({
a: ExampleItem(user: b, message: c, time: d).toJson()
}).catchError(//에러 처리);

read할 때는 다음과 같이 처리하고

FirebaseFirestore.instance.collection('name').get().then((value){
    value.docs.foreach((element){
       a: List.castFrom(element[key] as List ?? [] // null 처리
    });
});

사용할 때는 fromJson을 이용하면 됩니다

 

여기까지는 공식문서를 잘 활용하면 큰 고난(?)은 없습니다

 

그런데 List나 Map에 value를 add하고 싶을때에는 어떻게 해야될지 고민이 됩니다

 

다행이도 List에는 FieldValue.arrayUnion과 FieldValue.arrayRemove같은 method가 있어서

 

다음과 같이 처리할 수 있습니다

FirebaseFirestore.instance.collection('name').doc('docName').update({
    a: FieldValue.arrayUnion([value]);
});

 

아쉽게도 위 방법은 List에서만 사용 가능합니다 Map의 경우는 다른 방법을 써야된다는 것이죠

 

하지만 생각보다 아주 간단히 처리가 가능합니다

 

예를들어 Map<String, int> 값을 저장한다고 할 때

 

먼저 doc에서 a를 가져오고 String b에 int 5 를다음과 같이 처리합니다

FirebaseFirestore.instance.collection('name').doc('docName').update({
    'a.b': 5 
});

key1.key2: value 이런식으로 update하면 아주 간단히 처리할 수 있습니다

(필자는 이것때문에 2~3시간정도 버렸..)

 

read할 때에는 List와 동일하게 Map.castFrom을 사용하면 됩니다

반응형
Comments