Firebase Veri Tabanı İşlemleri
Veri Tabanına Veri Ekleme
Bu kısımda Andoridde Firebase üzerindeki veri tabanına nasıl erişip veri tabanına veri ekleyeceğimizi göreceğiz.
İlk olarak bir tane data class oluşturuyoruz ve bu class'ın içerisinde veri tabanına yükleyeceğimiz verileri tanımlıyoruz.
data class Post (val email: String, val comment : String, val downloadUrl : String )
Şimdi veri tabanına erişmek için gerekli olan tanımlamaları yapalım.
private lateinit var db : FirebaseFirestore
private lateinit var auth : FirebaseAuth
//onCreate içerisinde initialize etmek için
db = Firebase.firestore
auth = Firebase.auth
Sonrasında veri tabanına yükleyeceğimiz resimler için UUID oluşturuyoruz.
val uuid = UUID.randomUUID()
val imageName = "$uuid.jpg"
Sonrasında storage'a erişmek için şu kodları yazalım:
val storage = Firebase.storage
val reference = storage.reference
val imagesReference = reference.child("images").child(imageName)
Sonrasında resim yükleme işlemi için şu kodları yazalım:
//Eğer seçilen resim kısmı boş değilse, yani varsa
if (selectedPicture != null) {
imagesReference.putFile(selectedPicture!!).addOnSuccessListener { taskSnapshot ->
//Resim yüklendikten sonra bunun dosya yolunu veriyoruz
val uploadedPictureReference = storage.reference.child("images").child(imageName)
uploadedPictureReference.downloadUrl.addOnSuccessListener { uri ->
val downloadUrl = uri.toString()
Sonrasında veri tabanına yükleyeceğimiz verileri oluşturuyoruz.
Bu veriler database'e yüklenirken HashMap ile oluşturuluyor.
val postMap = hashMapOf<String,Any>()
postMap.put("downloadUrl",downloadUrl)
postMap.put("userEmail",auth.currentUser!!.email.toString())
postMap.put("comment",binding.uploadCommentText.text.toString())
postMap.put("date", Timestamp.now())
//Veri tabanına yükleme işlemi
db.collection( "Posts").add(postMap).addOnCompleteListener{task ->
if (task.isComplete && task.isSuccessful) {
//Yükleme başarılı, önceki sayfaya dönmek için
val action = AddFragmentDirections.actionAddFragmentToFeedFragment()
Navigation.findNavController(view).navigate(action)
}
Eğer yükleme işlemi başarısız olursa hata mesajını gösteriyoruz.
addOnFailureListener{exception -> Toast.makeText(requireContext(),exception.localizedMessage,Toast.LENGTH_LONG).show() }
Şu anda eklediğimiz resimler veri tabanında başarılı bir yüklü olarak gözüküyor.
Fonksiyonun tamamı şu şekilde:
fun uploadClicked(view: View) {
//UUID -> image name
val uuid = UUID.randomUUID()
val imageName = "$uuid.jpg"
val storage = Firebase.storage
val reference = storage.reference
val imagesReference = reference.child("images").child(imageName)
if (selectedPicture != null) {
imagesReference.putFile(selectedPicture!!).addOnSuccessListener { taskSnapshot ->
val uploadedPictureReference = storage.reference.child("images").child(imageName)
uploadedPictureReference.downloadUrl.addOnSuccessListener { uri ->
val downloadUrl = uri.toString()
println(downloadUrl)
val postMap = hashMapOf<String,Any>()
postMap.put("downloadUrl",downloadUrl)
postMap.put("userEmail",auth.currentUser!!.email.toString())
postMap.put("comment",binding.uploadCommentText.text.toString())
postMap.put("date", Timestamp.now())
db.collection( "Posts").add(postMap).addOnCompleteListener{task ->
if (task.isComplete && task.isSuccessful) {
//back
val action = AddFragmentDirections.actionAddFragmentToFeedFragment()
Navigation.findNavController(view).navigate(action)
}
}.addOnFailureListener{exception ->
Toast.makeText(requireContext(),exception.localizedMessage,Toast.LENGTH_LONG).show()
}
}
}
}
}
Not: Storage kısmı paralı hale geldiği için kendim çalıştıramadım, veri ekleme kısmındaki kodların tamamına buradan ulaşabilirsiniz.
Veri Tabanından Veri Alma
Veri tabanından veri almak için gerekli olan kodları yazalım.
İlk olarak gerekli tanımlamaları yapalım, bu iş için FeedFragment'ımıza yazacağız kodları.
Fakat bundan önce bir adet adapter oluşturuyoruz.
class FeedRecyclerAdapter(private val postList : ArrayList<Post>) : RecyclerView.Adapter<FeedRecyclerAdapter.PostHolder>() {
class PostHolder(val binding: RecyclerRowBinding) : RecyclerView.ViewHolder(binding.root) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostHolder {
val binding = RecyclerRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return PostHolder(binding)
}
override fun getItemCount(): Int {
return postList.size
}
override fun onBindViewHolder(holder: PostHolder, position: Int) {
holder.binding.recyclerEmailText.text = postList.get(position).email
holder.binding.recyclerCommentText.text = postList.get(position).comment
Picasso.get().load(postList[position].downloadUrl).into(holder.binding.recyclerImageView)
}
}
İlk olarak burada da tanımlamalarımızı yapalım.
private lateinit var auth : FirebaseAuth
private lateinit var db : FirebaseFirestore
var adapter : FeedRecyclerAdapter? = null
val postArrayList : ArrayList<Post> = ArrayList()
//onCreate içerisinde initialize etmek için
auth = Firebase.auth
db = Firebase.firestore
Sonrasında FeedFragment'ımızda onCreateView()
içerisinde adapter'ımızı initialize edelim.
adapter = FeedRecyclerAdapter(postArrayList) binding.recyclerView.adapter = adapter
Sonrasında FeedFragment'ımızda fun getDataFromFirestore()
içerisine şu kodları yazalım:
db.collection("Posts").orderBy("date", Query.Direction.DESCENDING)
.addSnapshotListener { snapshot, exception ->
if (exception != null) {
Toast.makeText(requireContext(), exception.localizedMessage, Toast.LENGTH_LONG)
.show()
}
Tarihe göre azalan sırayla postlarımızı alıyoruz. Eğer exception null değilse hata mesajını gösteriyoruz.
Eğer exception null ise veri var demektir, snapshot'ın içerisinde veri var mı kontrol ediyoruz. Eğer snapshot empty değilse kodlarımızı yazıyoruz.
else {
if (snapshot != null) {
if (!snapshot.isEmpty) {
postArrayList.clear()
val documents = snapshot.documents
for (document in documents) {
val comment = document.get("comment") as String
val useremail = document.get("userEmail") as String
val downloadUrl = document.get("downloadUrl") as String
//val timestamp = document.get("date") as Timestamp
//val date = timestamp.toDate()
val post = Post(useremail, comment, downloadUrl)
postArrayList.add(post)
}
//adapter'ımızı güncelliyoruz, haber veriyoruz ki veriler değişti.
adapter!!.notifyDataSetChanged()
}
}
}
}
}
Fonksiyonun tamamı şu şekilde:
fun getDataFromFirestore() {
db.collection("Posts").orderBy("date", Query.Direction.DESCENDING)
.addSnapshotListener { snapshot, exception ->
if (exception != null) {
Toast.makeText(requireContext(), exception.localizedMessage, Toast.LENGTH_LONG)
.show()
} else {
if (snapshot != null) {
if (!snapshot.isEmpty) {
postArrayList.clear()
val documents = snapshot.documents
for (document in documents) {
val comment = document.get("comment") as String
val useremail = document.get("userEmail") as String
val downloadUrl = document.get("downloadUrl") as String
//val timestamp = document.get("date") as Timestamp
//val date = timestamp.toDate()
val post = Post(useremail, comment, downloadUrl)
postArrayList.add(post)
}
adapter!!.notifyDataSetChanged()
}
}
}
}
}
Not: Storage kısmı paralı hale geldiği için kendim çalıştıramadım, veri alma kısmındaki kodların tamamına buradan ulaşabilirsiniz.