이번 글은 이전 글의 연장입니다. 이전 글에서는 오직 users collection에서 uid라는 document에 닉네임 필드를 생성했었죠.
이번에는 그 document에 diarys라는 collection에서 diary document를 생성해보도록 하겠습니다. 이를 하위 컬렉션이라고 부르더라고요.
VC들(MainVC, CreateVC)을 언급한지 꽤 됬으므로 다시 설명하자면 CreateVC는 날짜, 내용, 이미지를 받아서 MainVC의 delegate function을 호출하는 VC이며 MainVC는 작성한 일기를 보여주고 DiaryListVM을 통해 리스트를 갱신합니다.
여태까지 저장이랍시고 DiaryListVM에 리스트를 통해 저장해왔습니다. 제가 손봐야되는 곳은 DiaryListVM 입니다.
오늘은 DiaryListViewModel에서 create할 때 db도 같이 create 해보겠습니다.
class DBViewModel : NSObject {
let db = Firestore.firestore()
...
func makeDocument(uid:String, date:Date, emotion: String?, content: String, imageData: Data?){
var ref: DocumentReference?
ref = db.collection("users").document(uid).collection("diarys").addDocument(data:
["date" : Timestamp(date: date),
"emotion" : emotion ?? "",
"content" : content,
])
{ err in
if let err = err {
print("Error adding document: \(err)")
} else {
print("Document added with ID: \(ref!.documentID)")
}
}
}
...
}
db.collection("users").document(uid).collection("diarys").addDocument(data:
: 하위 컬렉션을 정의하고 도큐먼트를 생성합니다. 즉 users 컬렉션의 uid라는 도큐먼트에서 하위 컬렉션인 diarys를 정의하고 그 안에 도큐먼트를 생성합니다.db.collection("cities").document("LA").setData
를 통해 도큐먼트의 이름을 지정할 수 있지만 저는 사용하지 않았습니다. 그 이유는 일기에 제목이 있는 것도 아니라서 적절한 도큐먼트의 ID를 얻기 위해 addDocument()
로 무작위 document ID를 얻었습니다. class DiaryListViewModel: NSObject{
let dbViewModel = DBViewModel()
...
func createDiaryData(uid:String, date:Date, emotion: String?, content: String, imageData:Data?){
...
dbViewModel.makeDocument(uid: uid, date: date, emotion: emotion, content: content, imageData: imageData)
...
}
...
}
dbViewModel.makeDocument()
: dbViewModel의 makeDocument를 호출합니다.결과로 맨위를 보시면 users > {uID} > diarys > {docID}
순으로 되어 하위 컬렉션이 적절하게 생성되었음을 알 수 있고
자동생성된 document ID와 필드(date, emotion, content)를 확인할 수 있습니다.
Image는 Firestore가 아닌 Firebase Storage에 생성하도록 할 것 입니다. 따라서 다음 내용은 Firebase Storage 설치와 이미지 업로드가 되겠습니다.