[android/안드로이드] Firebase RealTime Database Insert 방법
1. Map을 이용한 insert 방식
private fun saveUserDB(firebaseUser: FirebaseUser) {
val userId = firebaseUser.uid.orEmpty()
val userEmail = firebaseUser.email.orEmpty()
val updateUserDB = userDB.child(userId)
val user = mutableMapOf<String, Any>()
user["userId"] = userId
user["userEmail"] = userEmail
auth.currentUser?.providerData?.forEach { userInfo ->
user["userSnsType"] = userInfo.providerId
}
updateUserDB.updateChildren(user)
}
UsersDB 에서 해당 userId로 child를 가져옵니다.
위 그림에서는 16FVhzd3UpgpEAoRRh5GKMINWc22(유저키) 가 해당됩니다.
Map으로 key,value 를 설정하고 updateChildren으로 해당 Map을 넣어주면 위와같이 해당 유저키에 값이 insert 되게 됩니다.
2. push() 를 이용한 객체 Insert 방식
override suspend fun insertSeeMovie(movie: Movie) {
val userId = auth.currentUser?.uid.orEmpty()
val insertUserDB = userDB.child(userId).child("see")
insertUserDB.push().setValue(movie)
}
UsersDB 에서 해당 userId로 child를 가져옵니다. 그 후에 "see" 라는 child 를 가져와서
push() 를 통해 해당 객체를 Insert 합니다.
하지만!! 여기서 중요한점!
push() 를 통해 객체를 Insert 하게 되면 자동적으로 key 를 생성하여 key의 하위에 객체가 insert 되게 됩니다.
위에선 key가 -MzjULTdrYPLOPPKqjXH 입니다.
아래 push() 함수의 내부구조를 보시면 알 수 있습니다.
@NonNull
public DatabaseReference push() {
String childNameStr = PushIdGenerator.generatePushChildName(repo.getServerTime());
ChildKey childKey = ChildKey.fromString(childNameStr);
return new DatabaseReference(repo, getPath().child(childKey));
}
3. 기본 setValue() 를 이용한 객체 Insert 방식
override suspend fun insertSeeMovie(movie: Movie) {
val userId = auth.currentUser?.uid.orEmpty()
val insertUserDB = userDB.child(userId).child("see").child(
"${movie.title}${movie.pubDate}${movie.userRating}"
)
insertUserDB.setValue(movie)
}
push() 방식은 알아서 key를 생성해서 하위에 insert 시켜주지만 기본 setValue()는 바로 하위에 insert 시켜주므로
따로 key를 child로 설정해주는것이 좋습니다.
중요 팁!!
push()를 통한 insert가 상당히 편하긴 하지만 나중에 특정 key 값의 객체를 delete 시킬 때 key를 찾기가 어려워 난감해지는 경우가 발생할 수 있습니다.
그러므로 왠만해선 key를 unique하게끔 본인이 지정을 하고 하위에 setValue() 하시는걸 추천드립니다.