일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- jszip
- userevent_tracker
- node
- web track
- methodChannel
- react
- code editor
- babel
- RouteObserver
- webrtc
- Three js
- uint8array
- REST API
- Completer
- androidId
- KakaoMap
- Excel
- Babel standalone
- Flutter
- Game js
- FirebaseAnalytics
- swagger-typescript-api
- Prism.js
- Image Resize typescript
- Raycasting
- uint16array
- typescript
- Three-fiber
- Redux
- identifierForVender
- Today
- Total
Never give up
Flutter - When you store collection in cloud firestore 본문
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을 사용하면 됩니다
'Flutter' 카테고리의 다른 글
Flutter - Provider Selector with tuple (3) | 2020.12.31 |
---|---|
Flutter - CachedNetworkImageProvider error handling? (0) | 2020.12.29 |
Flutter - When to use Enum(feat. authentication) (2) | 2020.11.30 |
Flutter - context, key example with snackbar, provider (0) | 2020.11.16 |
Flutter - Map<key, List<data>> with Listview(simple chatting screen) (0) | 2020.11.02 |