파이어베이스 실시간 데이터베이스에서 데이터를 읽어오는 방법
예제로 둘 파이어베이스의 데이터
일단 FirebaseDatabase를 import 해둔다.
1je36JAenW...뭐시기는 uid라는 변수로 대체한다.
데이터를 읽을 땐 reference객체가 필요하다.
reference객체를 생성한다.
//레퍼런스 객체 생성
let ref = Database.database().reference()
만약 User의 uid아래의 정보를 읽어오고 싶다면 이런 코드를 작성한다.
ref.child("User").child(uid).observe(.value){snapshot in
//데이터 처리 코드 작성
}
ref의 헤더에서 child(User)의 child(uid)의 value값들을 snapshot으로 observe한다는 소리.
snapshot은 guard let문으로 옵셔널 바인딩을 해주어야한다.
예제로 생성한 firebase의 데이터는 키와 값으로 이루어져 있으므로 Json 형식의 Dictionary타입의 데이터로 받아오게 된다.
Json형식으로 받아오기 때문에 Dictionary로 다운캐스팅을 해주고, Dictionary타입을 다시 한번 키값에 맞는 데이터 타입으로 다운캐스팅을 해줘야 한다.
최종 데이터를 받아와서 저장하는 코드는 이렇게 된다.
ref = Database.database().reference()
ref.child("User").child(self.uid!).observe(.value){ snapshot in
guard let value = snapshot.value as? NSDictionary else {return}
self.UserDataList.Id = value["id"] as? String ?? "No string"
self.UserDataList.StudentNumber = value["StudentNumber"] as? String ?? "No StudentNumber"
self.UserDataList.PhoneNumber = value["PhoneNumber"] as? String ?? "No PhoneNumber"
run = false
}
UserDataList는 미리 생성해놓은 구조체이다. 구조체를 만들 때 파이어베이스의 데이터 형식과 Swift의 구조체 데이터 형식이 같아야한다. 또한 value로 옵셔널 바인딩 하였으므로 value[키값]을 입력하면 필요한 키 값의 데이터를 Swift의 구조체로 받아와 사용할 수 있다.
만약 User같은 구조체 데이터가 배열 형태로 저장되어야 할 경우
let ComplusorySubjectItem = CompulsorySubjectSnapshot.value as? [String: Any] ?? [:]
for index in ComplusorySubjectItem{
for i in 0...self.CompulsorySubjectList.CompulsorySubjectList.count - 1{
if index.value as! String == self.CompulsorySubjectList.CompulsorySubjectList[i].SubjectName{
self.UserDataList.CompulsorySubjectList.append(Subject(SubjectName: index.value as! String, SubjectCredit: self.CompulsorySubjectList.CompulsorySubjectList[i].SubjectCredit))
}
}
}