DocumentReferance ve CollectionReferance Kullanımı

By | 31 Ocak 2021

Firebase Dersleri serisinin DocumentReferance ve CollectionReferance Kullanımı dersine hoş geldiniz. Bu dersimizde bunları kullanarak veri tabanına okuma ve yazma işlemlerini yapacağız. Ayrıca bilgileri de kullanıcıdan alacağız.

DocumentReferance ve CollectionReferance genelde ne için kullanılır ufaktan bahsedelim.

  • Belli bir dosya üzerinde işlemler yapılacağı zaman DocumentReferance kullanılır.
  • Bir koleksiyon içerisinde işlem yapılacağı zaman CollectionReferance kullanılır.

Aşağıdaki veri tabanı modelimizi inceleyelim.

  1. En üst veya kök kısımda koleksiyon yer alır. Burada birden fazla koleksiyon bulundurabiliriz.
  2. Koleksiyonların içinde belgeler(dosyalar) yer alır.
  3. Belgelerin içinde tekrardan koleksiyon oluşturabiliriz.
  4. Belgelerin içinde genellikle içerikler olur.

DocumentReferance ve CollectionReferance’i ne için kullandığımızı artık az çok anlamışızdır. O halde nasıl kullanıldıklarına başlayalım.

DocumentReferance Nasıl Kullanılır?

Bu örneğimizde kullanıcıdan Ad ve Soyad bilgilerini alalım ve veri tabanımıza yazdıralım. İşlem başarılı bir şekilde gerçekleşir ise verileri bu kez çekip kullanıcıya gösterelim.

activity_main.xml dosyası;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:gravity="center"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_ad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Ad"
        android:padding="20dp"/>

    <EditText
        android:id="@+id/et_soyad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Soyad"
        android:padding="20dp"/>

    <Button
        android:id="@+id/btn_gonder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="gönder"
        android:padding="20dp"/>

</LinearLayout>

MainActivity.java dosyası;

package com.mrcaracal.fbdersleri;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;

public class MainActivity extends AppCompatActivity {

    EditText et_ad, et_soyad;
    Button btn_gonder;
    FirebaseFirestore firebaseFirestore;

    private void init(){
        et_ad = findViewById(R.id.et_ad);
        et_soyad = findViewById(R.id.et_soyad);
        btn_gonder = findViewById(R.id.btn_gonder);
        firebaseFirestore = FirebaseFirestore.getInstance();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();

        btn_gonder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // Kullanıcının girmiş olduğu bilgileri alıyoruz
                String ad = et_ad.getText().toString();
                String soyad = et_soyad.getText().toString();

                // Veritabanına verileri yazdırmak için uygun bir modül oluşturduk ver kullanıcının girdiği verileri oraya gönderiyoruz
                BilgilerModul bilgilerModul = new BilgilerModul(ad, soyad);

                // Bu kısım bizim bi' nevi dosya adresimizi belirttiğimiz alan
                // Bilgiler koleksiyonu içerisinde ad-soyad şeklinde (Örnek: Murat-Karaman) bir dosya oluşmasını sağladık.
                // Kullanıcı Ad-Soyad bilgisi olarak ne girerse dosya da ona göre isimlendirilecek.
                // Girdiği bilgiler daha önceden var ise eskisinin üzerinde işlemler yapılacak
                DocumentReference documentReference = firebaseFirestore
                        .collection("Bilgiler")
                        .document(ad+"-"+soyad);

                // Belirtilen dosyaya kullanıcının girdiği verileri gönderiyoruz set() ile
                documentReference
                        .set(bilgilerModul)
                        .addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {

                                // İşlemin başarılı bir şekilde gerçekleşmesi durumunda çalışacak olan kısım
                                // Kullanıcının girdiği veriler Veritabanına yazdırıldığına göre bu kez Veritabanından verileri çekip kullanıcıya gösterebiliriz
                                // Hangis dosya erişmek istediğimizi(Yolunu) belirtiyoruz
                                DocumentReference documentReference1 = firebaseFirestore
                                        .collection("Bilgiler")
                                        .document(ad+"-"+soyad);

                                // Belirtilen adresteki verilerimizi get() ile çekiyoruz
                                documentReference1
                                        .get()
                                        .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                                            @Override
                                            public void onComplete(@NonNull Task<DocumentSnapshot> task) {

                                                // İşlemin başarılı olması durumunda yapılacaklar
                                                if (task.isSuccessful()){

                                                    // Çekilen verileri task.getResult() ile çekiyoruz
                                                    // Kullanabilir hale getirmek için DocumentSnapshot'a dönüştürdük
                                                    DocumentSnapshot documentSnapshot = task.getResult();

                                                    if (documentSnapshot.exists()){

                                                        // Çekilip dönüştürülen veri gerçekten var ise aşağıdaki gibi belli değişkenlere atayıp kullanabiliriz
                                                        String str_cekilen_ad = documentSnapshot.getString("ad");
                                                        String str_cekilen_soyad = documentSnapshot.getString("soyad");
                                                        Toast.makeText(MainActivity.this, "Ad: "+str_cekilen_ad+"\nSoyad: "+str_cekilen_soyad, Toast.LENGTH_SHORT).show();

                                                    }
                                                }
                                            }
                                        }).addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        // İşlemin başarısız olması durumunda çalışan ve hata mesajını kullanıcıya gösterdiğimiz kısım
                                        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // İşlemin başarısız olması durumunda çalışan ve hata mesajını kullanıcıya gösterdiğimiz kısım
                        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }
}

BilgilerModul.java dosyası;

package com.mrcaracal.fbdersleri;

public class BilgilerModul {

    private String ad;
    private String soyad;

    public BilgilerModul(String ad, String soyad) {
        this.ad = ad;
        this.soyad = soyad;
    }

    public String getAd() {
        return ad;
    }

    public void setAd(String ad) {
        this.ad = ad;
    }

    public String getSoyad() {
        return soyad;
    }

    public void setSoyad(String soyad) {
        this.soyad = soyad;
    }
}

Yapılan işlemler adım adım yorum satırlarında açıkça belirtilmiştir. Uygulamanın çalışır halini aşağıdan görebilirsiniz.

Şimdi de aynı veri tabanı üzerinde  CollectionReferance kullanarak işlemler yapalım.

CollectionReferance Nasıl Kullanılır?

Bir koleksiyonun içinde işlem yapacağımız zaman bu yapıdan faydalanırız. Üstte yaptığımız örneği bu kez CollectionReferance kullanarak yapalım.

activity_main.xml dosyası;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:gravity="center"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_ad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Ad"
        android:padding="20dp"/>

    <EditText
        android:id="@+id/et_soyad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Soyad"
        android:padding="20dp"/>

    <Button
        android:id="@+id/btn_gonder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="gönder"
        android:padding="20dp"/>

</LinearLayout>

MainActivity.java dosyası;

package com.mrcaracal.fbdersleri;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.Map;

public class MainActivity extends AppCompatActivity {

    EditText et_ad, et_soyad;
    Button btn_gonder;
    FirebaseFirestore firebaseFirestore;

    private void init(){
        et_ad = findViewById(R.id.et_ad);
        et_soyad = findViewById(R.id.et_soyad);
        btn_gonder = findViewById(R.id.btn_gonder);
        firebaseFirestore = FirebaseFirestore.getInstance();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();

        btn_gonder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // Kullanıcının girmiş olduğu bilgileri alıyoruz
                String ad = et_ad.getText().toString();
                String soyad = et_soyad.getText().toString();

                // Veritabanına verileri yazdırmak için uygun bir modül oluşturduk ver kullanıcının girdiği verileri oraya gönderiyoruz
                BilgilerModul bilgilerModul = new BilgilerModul(ad, soyad);

                // Bu kısım bizim koleksiyon adresini belirttiğimiz alan
                CollectionReference collectionReference = firebaseFirestore
                        .collection("Bilgiler");

                // Belli bir dosya adresi belirtmediğimizden dolayı Bilgiler koleksiyonu içinde random isimlerde dosyalar oluşacak
                // Belli sorgu ver koşullar belirtmediğimiz sürece girilen veriler daha önceden var olsalar bile yeni bir dosya oluşturulup oraya eklenecek
                // Belirtilen koleksiyon içerisine add() ile bilgileri gönderiyoruz
                collectionReference
                        .add(bilgilerModul)
                        .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                            @Override
                            public void onSuccess(DocumentReference documentReference) {

                                // İşlemin başarılı bir şekilde gerçekleşmesi durumunda çalışacak olan kısım
                                // Kullanıcının girdiği veriler veritabanına yazdırıldığına göre bu kez veritabanından verileri çekebiliriz
                                // CollectionReferance ile hangi koleksiyonun içindeki dosyalara erişmek istediğimizi belirtiyoruz
                                CollectionReference collectionReference1 = firebaseFirestore
                                        .collection("Bilgiler");

                                // Belirtilen adresteki tüm dosyaların içeriklerini get() ile çekiyoruz
                                collectionReference1
                                        .get()
                                        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                            @Override
                                            public void onComplete(@NonNull Task<QuerySnapshot> task) {

                                                // İşlemin başarılı olması durumunda yapılacaklar
                                                if (task.isSuccessful()){

                                                    // Çekilen verileri task.getResult() ile çekiyoruz
                                                    // Çekilen dosyaları ve verileri okuyabilmek için uygun biçimlere dönüştürüyoruz
                                                    // Bir dosya değil de birçok dosya ve içerisindeki verileri çekiyoruz. Bu sebepten foreach döngüsünden faydalanıyoruz
                                                    QuerySnapshot querySnapshot = task.getResult();

                                                    for (DocumentSnapshot documentSnapshot : querySnapshot){

                                                        // Her defasında bir dosyanın içerisindeki verileri çekip logcat ile yazdırdık
                                                        // Verilere almak için ise bizden istendiği gibi Map kullandık
                                                        Map<String, Object> map = documentSnapshot.getData();
                                                        String str_cekilen_ad = (String) map.get("ad");
                                                        String str_cekilen_soyad = (String) map.get("soyad");

                                                        Log.i("CR_Kullandik","Ad: "+str_cekilen_ad+"\nSoyad: "+str_cekilen_soyad);

                                                    }
                                                }
                                            }
                                        }).addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }
}

BilgilerModul.java dosyası;

package com.mrcaracal.fbdersleri;

public class BilgilerModul {

    private String ad;
    private String soyad;

    public BilgilerModul(String ad, String soyad) {
        this.ad = ad;
        this.soyad = soyad;
    }

    public String getAd() {
        return ad;
    }

    public void setAd(String ad) {
        this.ad = ad;
    }

    public String getSoyad() {
        return soyad;
    }

    public void setSoyad(String soyad) {
        this.soyad = soyad;
    }
}

Yapılan işlemler adım adım yorum satırlarında açıkça belirtilmiştir. Uygulamanın çalışır halini aşağıdan görebilirsiniz.

Üstteki resimde görüldüğü üzere belirtilen Koleksiyon içerisindeki tüm dosyaların içindeki verileri çektik. İleriki derslerimizde istediğimiz koşullara uygun olanları çekmeyi, istediğimiz veri üzerinde değişiklik yapmayı öğreneceğiz.

Aşağıdaki resimde de görüldüğü gibi veriler her defasında girildiğinde dosyaların isimleri random olarak belirleniyor. Veri kaydetme işleminde her dosya için isim belirtme zorunluluğunu kaldırır. Böylelikle olur da ayni özelliklere sahip bir veri girildiğinde üzerine yazmak yerine yeni bir dosyaya yazmış olacaktır.

Bir sonraki dersimizde çekilen birçok veriyi nasıl filtreleyebileceğimizi ve belli biz düzene göre nasıl çekeceğimizi öğreneceğiz. Bir sonraki dersimizde görüşmek üzere.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir