Bütünsel Yaklaşımla(BPPB) Flutter Firebase İşlemleri

not: bu makalede sıkça geçen BPPB(Bütünsel yaklaşım) bir önermedir. Kendi çıkarımlarımdan oluşturduğum kavramsallarştırmalar içerir.
Bütünsel yaklaşım..Bütünden Parçaya – Parçadan Bütüne (BPPB):
Bütünsel yaklaşım(BPPB) mevcut durumun bir manzarasını verir. Parçanın bütündeki yerini daha konuyu yeni öğrenmeye başlarken öğrenmiş olursunuz. Bu sayede daha sonra öğreneceklerinizi bu resmin eksik kısımlarına yerleştirebilirsiniz. Daima konrol sizde olur ve bilginin override 🙂 olmasının önüne geçersiniz… Yazılım diliyle de bir çeşit soyutlama elde edersiniz…
Eğer bir puzzle ın bitmiş halini görmüş olsaydınız resmin çok karmaşık olmasının bir önemi kalırmıydı?
bir çoğunuzun dikkatini çekmiştir bu sitedeki menüler bütünden parçaya parçadan bütüne (BPPB) yaklaşımıyla tasarlanmıştır.
ilk başta çoğunuza garip gelmiş olabilir. Nedeni, klasik eğitimde yediğimiz formattan kaynaklanır. klasik eğitim parçadan bütüne gitmeye çalışır ve ayrınya boğar… işin en sinir bazucu tarafı bu öğretim şeklini farketmeden kabullendiğimiz için öğretirken bizde aynı yöntemi kullanırız. internette herhangi bir konuyu araştırdığınızda bu teknikle yazılmış (yabancı kaynalarda dahil) makaleler görürüsünüz ve konunun sınırlarını öğrenebilmek, parçaları birleştirebilmek için hiçbir zaman tek bir makale yetmez …
Bütünsel Yaklaşım Aşamaları
1.Bütünsel Çıkarım (BÇ)
Konunun kaba taslak bir özeti / alan taraması olarak özetlenebilir. Burada amaç kaba çıkarıma hazır hale getirmektir. Mümkün olanı en geniş ve öz biçimde içermeli ayrıntıyı dışlamalıdır.
Bütünsel Çıkarım aslında bir sınırlandırmadır.
Bütünsel yaklaşımda ilk aşama mutlaka bir Bütünsel Çıkarım (BÇ) aşamasıyla başlar ve bir çok yerde tekrar edebilir.
Bütünsel çıkarım sonucunda konuyla ilgili bir şey söylenmelidir; Bütünsel Çıkarım Cümlesi(BÇC)
Bütünsel Çıkarım sonucu bir bütünsel çıkarım cümlesi elde ederiz ; Bütünsel Çıkarım (BÇ) => Bütünsel Çıkarım Cümlesi(BÇC).
2.Bütünsel Çıkarım Cümlesi(BÇC)
Bilginin ayrıntılı içeriğine erişmek(hatırlamak) için bir referans ve perspektif sunan, konuyu en kısa şekilde özetleyen, kapsayıcı ve sınırlayıcı, söylenebilecek en kısa sözdür.(ekmek kırıntıları, tiyo, spoiler :), ve yeni fikirler)
Bütünsel çıkarım cümlesi bilginin daha ayrıntılı haline bir referanstır.
Bütünsel yaklaşım aşamalarından herhangi birinde bir bütünsel çıkarım cümlesi elde ettiğimizde bir parça seçmek durumunda kalırız;Ey Yaygın Kritik Parça Tespiti (EYKPT) .
Örneğin konun bir aşaması BÇ ve BÇC daha sonra bir EYKPT daha sonra tekrar bir BÇ gibi…
3. Ey Yaygın Kritik Parça Tespiti (EYKPT)
Kritik parçalardan en yaygın kullanılanı. Puzzle nin en yaygın ve resmi tahmin etmeyi sağlayan mevcut aşamaya göre en önemli parçasıdır.
Bu parça resmin görece boş kısımları olamamalı, örneğin manzaradaki gökyüzü yada denizin parçası gibi değil, resmi tahmin etmeyi sağlayan en kritik fakat olabildiğince de yaygın bir parçası olmalı. Daha sonra bu kritik parçaya BÇ uygulanır.
BÇ => BÇC => EYKPT => BÇ => BÇC => EYKPT => BÇ => BÇC …. özümseme…yeni filkir yeni bilgi üretimi
En Yaygın Kritik Parça, ilişki sayısının en fazla olduğu yerde bulunur.(kümelerin kesişimi, kavşaklar, altın..)
1.Firestore sınıfı için Bütünsel Çıkarım (BÇ):
class Firestore {
///YERLEŞİKLER:
///Firestore işlemlerini gerçekleştirmeyi sağlayan static get metodu, Firestore nesnesini(instance) yani kendisini döndürür.
static Firestore get instance => Firestore();
/// FirebaseApp : Firebase e bağlı uygulamayı FirebaseApp cinsinden döndürür.
FirebaseApp get app;
//settings : ayarlar
Future settings({bool persistenceEnabled, String host, bool sslEnabled, int cacheSizeBytes});
///REFERANSLAR :
///1. kolleksiyon referansı: CollectionReference,
/// 2. grup kolleksiyonu referansı:Query,
/// 3. döküman referansı: DocumentReference
// CollectionReference : path ver geriye collecsiyon refenası al
CollectionReference collection(String path);
// // Query : path ver geriye collecsiyonGrup refenası Query al
Query collectionGroup(String path);
//DocumentReference : path ver DocumentReference al
DocumentReference document(String path);
///TOPLU OPERASYONLAR: batch,Transaction
///Atomic işlemler:Bir dizi atomik işlemde, ya tüm bir dizi toplu işlemler başarılı olur uygulanır ya da biri başarısız olduğunda tümü başarısız olur hiçbiri gerçekleştrilmez!.
///İki tip atomik işlem vardır.
///1. Batched Writes:bir veya daha fazla dökümana update, delete ve set işlemlerini tek seferde-atomic olarak yapma işlemidir.Okuma-read Hariç!( update, delete ve set yazma işlemi olarak kabul edilir!)
///2. Transactions: bir veya daha fazla döküman üzerinde read, update, delete ve set işlemlerini tek seferde-atomic olarak yapma işlemidir. Okuma-Read dahil!
///1.batch(...):
///bir okuma (yani read olarak kabul edilen) işlemi içermeyen!! ama bir dizi update, delete ve set gibi (ki hepsi write-yazma olarak kabul edilen) toplu işlemleri
/// tek bir işlemde gerçekleştiren metod.
/// İşlemler commit işlemi çağrılana kadar icra edilmez!!!
/// Bu işlemler: delete, setData, updateData dır. en son commit çağrılır.
WriteBatch batch(); ///WriteBatch nesnesi döndürür bu nesne;
/// A [WriteBatch], tek bir birim olarak bir den çok işlemi gerçekleştirecek bir dizi yazma işlemi sağlar.
/// [WriteBatch] üzerinde yapılan işlemler siz [commmit] yapana kadar geçerli olmaz.
/// [WriteBatch] tamamlandığında üzerinde başka işlem yapılamaz ve tekrar gerçekleştirilemez.
void delete(DocumentReference document); // silme
void setData( DocumentReference document, Map<String, dynamic> data, {bool merge = false} ); // ekleme
void updateData(DocumentReference document, Map<String, dynamic> data); //güncelleme işlemi
Future commit(); //tüm işlemlerin tek seferde gerçekleştirilme işelemini uygular.En son çağrılır.
///2.runTransaction(..)
///runTransaction yöntemi içerisine transactionHandler(bir fonksiyon tanımı tipi) ve gecikme zamanı(varsayılanı 5 saniyedir) alır.
///transactionHandler bu Firestore nesnesinin içerisindeki bir metod tanımının referansını alır!!! (calback fonksiyonlar),
/// Kısaca bu fonksiyon şöyle tanımlanmalıdır:fonksiyonun baş kısmı parametre olarak bir Transaction tipinden paramerte almak zorundadır.Şöyle (Transaction transaction){ ...}
/// gövde kısmında, transaction nesnesi halihazırda oluşturulmuş olacağı için bu transaction nesnesini kullanarak istenen read da dahil atomic toplu işlemeler gerşekleştitilebilir.
Future<Map<String, dynamic>> runTransaction(TransactionHandler transactionHandler, {Duration timeout = const Duration(seconds: 5)});
///Transaction sınıfının gerçekleştirebildiği işler: Firestore.instance.runTransaction((Transaction transaction){ transaction.get,set,update,delete });
Future get(DocumentReference documentReference);//READ!!!
Future set( DocumentReference documentReference, Map<String, dynamic> data)://insert ekleme
Future update( DocumentReference documentReference, Map<String, dynamic> data) ;//güncelleme
Future delete(DocumentReference documentReference) ;//silme
}
2. flutter Firestore sınıfı için Bütünsel Çıkarım Cümlesi(BÇC):
flutter Firestore sınıfı, toplu operasyonlar için batch ve runTransaction yöntemlerini, tekil operasyonlar için döküman ve kolleksiyonların referansını veren yöntemleri içerir.
Toplu operasyonlar gerçekleştirmek istiyorsak iki yol var;
batch,Transaction
batch: read yani okuma içermeyen toplu operasyonlar için.
Transaction: read yani bir okuma da içeren toplu operasyonlar için.
Tekil operasyonlar için ise referansları veren 3 yöntem içerir:
1. kolleksiyon referansını verir : CollectionReference collection(String path)
2. grup kolleksiyonu referansını verir: Query collectionGroup(String path)
3. döküman referansını verir: DocumentReference document(String path)
Görüldüğü gibi bu bir sınırlandırmadır. Konunun sınırları artık az çok belirlenmiş olduk. flutter Firestore sınıfı için genel manzara böyle şimdi pazzle ı dolduralım.
3.Ey Yaygın Kritik Parça Tespiti (EYKPT) : DocumentReference
Bu kısımda en yaygın başvurulan DocumentReference gibi duruyor.
class DocumentReference {
///YERLEŞİKLER
///DocumentReference sınıfı bir Firestore referansı içerir.
/// Firestore nesnesi üzerinde document(..) yöntemi ile bir DocumentReference getirdiğimizde, bu DocumentReference nesnesi içinden tekrar aynı Firestore nesnesine erişileblir.
final Firestore firestore;
// dokumanın veritabanındaki/firestore deki yolu
String get path
/// Bu dükümanın kolleksiyonun içindeki, atanmış yada otomatik oluşturulmuş id si
String get documentID
///REFERANSLAR
///ust-parent collection
/// bağlı olduğu kollecsiyonu CollectionReference türünden döndürür.
/// CollectionReference ile : bu dökümanın bağlı olduğu kollecsiyonun Id sine ve bu kolleksiyonun bağlı olduğu üst-parent dökumana ulaşabiliriz.
/// bu döküman -> bağlı olduğu kolleksiyonu CollectionReference türünden verir
CollectionReference parent()
///Bu doküman içerisinde işaret edilem bir kolleksiyonun referansını döndürür. alt-child kolleksiyonlardan biri
CollectionReference collection(String collectionPath)
///OPERASYONLAR
/// bu dökümanı firestore de okuma, eğer dökuman yok ise okuma başarısız olur null döndürür.
/// döküman var ve başarılı bir okuma işlemi ise geriye Future tütünde DocumentSnapshot nesnesi döndürür.
Future get({platform.Source source = platform.Source.serverAndCache})
// bu konumdaki dokumandaki değişikliğin bildirimi-haber verilmesi. akış türünde değişikliği dinleyebilmeyi sağlar.
// get ten farkı her değişiklik gerçekleştiğinde son değişmiş değeri alabilirsiniz. get te ise o anlık değeri getiriir.
Stream snapshots({bool includeMetadataChanges = false})
//bu dökümana yazma işlemi
//eğer döküman henüz yok ise oluşturulur.
//merge/birleştir true ise ve hali hazırda böyle bir data var ise datayla birleştirilir. merge/birleştir false ise data ayrı olarak eklenir.varsayılan false.
Future setData(Map<String, dynamic> data, {bool merge = false})
///data guncellemesi - eğer döküman yok ise guncelleme başarısız olur
Future updateData(Map<String, dynamic> data)
///bu döküman tarafından temsil edilen dökümanı database te siler
Future delete();
///YERLEŞİK OPERASYON
// iki DocumentReference nesnesinin aynı nesne olup olmadığı bu yöntemle belirleniyor.Kısaca iki döküman aynı döküman mı?
///(operator ==(dynamic o) buradaki "o" diğer nesneyi temsil eder.
///diğer nesne tipi(o) bir DocumentReference tipinde mi (dokuman mı)
///ve diğer nesnenin içinde barındırdığı firestore nesnesiş, bu(this) DocumentReference nesne içindeki firestore nesnesiyle aynımı(firestore nesnlerinin refleri aynımı)
///ve diğer nesnenin içindeki path ile bu nesnenşn ( bu DocumentReference) path i aynımı.(dokuman yolu aynı mı)
///Hepsi koşulu sağlarsa aynı DocumentReference(döküman) nesnesidir.(operator ==(dynamic o) true ise aynı dökümandır)
@override
bool operator ==(dynamic o) =>
o is DocumentReference && o.firestore == firestore && o.path == path;
}
5.DocumentReference sınıfı için Bütünsel Çıkarım Cümlesi(BÇC):
DocumentReference sınıfı path, id, üst kolleksiyon referansı ve kendisine bağlı alt kollensiyonların referensları gibi daha çok bu dökümanın konumu ve kimliğine ait bilgileri sağlayan
yöntemler ile firestorde doğrudan yapılabilen crud operasyonlar olarak isimlendirebileceğimiz okuma, değişikliği dinleme, veri ekleme, güncelleme ve silme yöntemlerini ve ilişkili firestore nesnesini içerir.
Bu DocumentReference sın firestor daki konumu ve kimliğine ait bilgiler:
path : String get path()
id : String get documentID()
üst kolleksiyon referansı : CollectionReference parent()
kendisine bağlı hrehangibir alt kollensiyonun referansı : CollectionReference collection(String collectionPath)
DocumentReference içinden firestorda doğrudan yapılabilen operasyonlar:
okuma : Future get(..) ,
değişikliği dinleyerek okuma : Stream snapshots(..),
veri ekleme : Future setData(Map data)
güncelleme : Future updateData(Map data)
silme : Future delete()
dökümanı okuma: Future get, Stream snapshots
DocumentReference sınıfı bu dokumanın verisini okumayı-firestore dan getirme işlemini, tek seferlik-anlık ve her değiştiğinde-sürekli olacak şekilde iki farklı yöntemle sağlar.
get metodu veritabanındaki her sorguda anlık görüntüsüne erişmeyi bir Future türünden getirerek sağlarken,
snapshots yöntemi, her değişikliği haber veren dinlemeyi sağlayan akış Stream türünden getirerek sağlar.
Veri akleme: firestore de bu dökümana veri ekleme işlemi datanın map şeklinde setData ve updateData yöntemleriye gönderilerek sağlanırken, silme işlemi her hangibir paramaetre almayan delete yöntemiyle yapılır.
Bu döküman(DocumentReference) bir firebase nesnesiyle elde edilmiş ve kendisine yine aynı firebase nesnesi gömülmüş olduğu için ayrıca bu firebase nesnesi private olmadığı için çok esnek bir kullanım sağlar. ilişkili firebase nesnesinin mümkün tüm içeriğine erişim sağlayabilir.
Şimdi burada biraz soluklanıp elimizdekilere bir bakalım.
2 adet BÇ
2 adet BÇC
2 adet EYKPT
Bunlardan Bütünsel çıkarım cümlelerini aldığınızı düşünün iki adet cümle.
Size ilşkili bütünsel çıkarımlarının referanslarını verecektir. Bütünden parçaya…
Bütünsel çıkarım cümlesi bilginin daha ayrıntılı haline bir referanstır.
BÇ ye indiğinizde EYKPT ye ulaşırsınız.. Parçadan bütüne..
Bütünsel yaklaşım zihninizde hatırlaması ve ilişkilendirilmesi kolay genel şablonlar sunar…
Şimdi kaldığımız yerden devam diğerleri konusunda az çok fikrimiz var en kritik parça DocumentSnapshot gibi duruyor.
6.Ey Yaygın Kritik Parça Tespiti (EYKPT) :DocumentSnapshot
class DocumentSnapshot {
///Bir DocumentSnapshot nesnesi , Firestore da veritabınındaki bir dökümandan okunan verileri içerir.
/// verilere, data özelliğiyle veya belirli bir alana erişmek için key kullanılarak elde edilebilir.
///YERLEŞİKLER
/// snapshot dökümanının id sini getirir
String get documentID
/// Döküman varsa "true" değerini döndürür.
bool get exists
///REFERANSLAR
///DocumentSnapshot nesnesiyle ilişkili dökümanın DocumentReference türünden referansı..Burada ise ilişkili firestore nesnesi yerine ilişkili DocumentReference verilmiş.
DocumentReference get reference
/// Dökümanın kaynağıda ve localde değişiklik olup olmadığı ile ilgili meta/üst verileri içerir.
/// Döküman localde yada kaynakta değişikliğe uğramış olabilir.
/// (Örn:internet kesintisinde localde yada başka kullanıcı tarafından bu nesnedeki datanın güncellenmesi gibi bilgiler, sanırım şimdilik anladığım bu )
SnapshotMetadata get metadata
///Nihayet VERİNİN HAM HALİNİN ELDESİ
///Dökümanın o anlık görüntüsünün tüm verilerini getirir
Map<String, dynamic> get data
/// Anlık görüntüden tek tek değerleri okur, Key ver dökümanın alanından değerini getir..gibi
dynamic operator [](String key) => data[key];
}
8.DocumentSnapshot sınıfı için Bütünsel Çıkarım Cümlesi(BÇC):
DocumentSnapshot sınıfı ilişkili dokumanın id sini (id), var olup olmadığını (exists), ilişkili dokumanın referansını (referans), anlık bilginin güncel halinde bir değişiklik olup olmadığını(metadata) öğrenebileceğimiz get metodları sunarken, verinin anlık olarak bütün halini map(data) şeklinde verir ayrıca verinin alanlarınada key yoluyla erilebilmesini sağlayan operatör içerir.
DocumentSnapshot sınıfı veritabanındaki ham bilginin sarmalandığı sınıftır. En nihayetinde firestore deki veritabanaındaki ham veriye bu sınıf yoluyla dokunuruz.
Biraz yukarılara çıkma vakti..dökümanları bir arada tutan CollectionReference diğer bir kritik parça.
9.Ey Yaygın Kritik Parça Tespiti (EYKPT) :CollectionReference
10.CollectionReference sınıfı için Bütünsel Çıkarım (BÇ):
class CollectionReference extends Query {
//YERLEŞİKLER
/// referansın id si
String get id
///bu kolleksiyonun veritabaındaki yolunu verir
String get path
///REFERANSLAR
///Kolleksiyonun ait olduğu(parent) dökümanı DocumentReference tipinde verir. bu kolleksiyon root kolleksiyon(en üst) ise null döndürür!
DocumentReference parent()
///OPERASYONLAR
/// kolleksiyona döküman ekleme:
///path/yol ile sağlanan bu kolleksiyonun içerisindeki bir dökünanı DocumentReference türünde verir
///path/yol yok ise otomatik oluşturulmuş id kullınılır.
DocumentReference document([String path])
/// kolleksiyona doğrudan data ekleme:
/// bir map data yı bu kolleksiyon içerisine, otomatik olarak üretilmiş bir benzersiz id ye sahip bir dökümanı oluşturarak ekler ve bu dökümanın referansını DocumentReference olarak döndürür.
/// oluşturulan benzersiz id bir zaman damgası ön eki içerir bu sayede bu kolleksiyonun içerisindeki dökümanlar kronolojik olarak saklanmış olur.
Future add(Map<String, dynamic> data)
}
bağlı olduğu paren dökümanına eriş, : DocumentReference parent()
alt dökümanlarına eriş, yok ise oluşturarak eriş : DocumentReference document([String path])
doğrudan dokumanını oluşturupp data ekle : Future add(Map<String, dynamic> data)
11.CollectionReference sınıfı için Bütünsel Çıkarım Cümlesi(BÇC):CollectionReference sınıfı kendi kimliğine ve konumuna ait id, path bilgisini ve parent dokumanın referansını döndüren yöntemlere sahiptir. Ayrıca bir dökümanına erişirken oluşturabilmeyi sağlayan document([String path]) metoduna ve data eklerken dökümannını oluşturabilmeyi sağlayan add metoduna sahiptir. Her ikiside dökümanın referansını döndürür. Burada en öenmli şey Query sınıfından miras alıyor oluşu bu tüm cümleyi değiştirir !!!
tekrar BÇC yi kuaracak olursak : CollectionReference sınıfı firestorede hermen hemen her türlü veritabanı işlemini derinlemesine yapabilme imkanına sahiptir.
Burada belkide en kritik parça Query sınıfıydı ziyani yok devam…Bu tür durumlara yol açmamak için konuya girmeden önce bir genel tarama yapmak çok yararlı olabilir. Yinede elimizde BÇ -> BÇC, EYKPT aşamaları var, bunları tek tek çıktılarını alırsak lego gibi yer değiştirebilme imkanına sahibiz. Bu modelin avantajlarından biri..
gelelim Query sınıfına..
12.Ey Yaygın Kritik Parça Tespiti (EYKPT) :Query
13.Query sınıfı için Bütünsel Çıkarım (BÇ):
// 1.000.000 >= (bir milyona eşit ve büyük şehirleri seç)
// db.collection("şehirler").orderBy("nüfüs").startAt(1000000);
// start : taBan
// end : taVan
// at : Dahil
// after : Sonra
// before : Önce
///Query sınıfı belirli bir konumdaki veriler üzerindeki bir sorguyu temsil eder.
class Query {
final Firestore firestore;
Map<String, dynamic> buildArguments()
//döküman reflerinin listesini ve dinleyen tutan QuerySnapshot getir
Stream snapshots({bool includeMetadataChanges = false})
//döküman reflerinin listesini tutan QuerySnapshot getir
Future getDocuments({ platform.Source source = platform.Source.serverAndCache, })
//bu sorguya ait kolleksiyon referansıı
CollectionReference reference()
//hangi alanı + filtreleyerek
Query where( dynamic field, { dynamic isEqualTo, dynamic isLessThan,dynamic isLessThanOrEqualTo,dynamic isGreaterThan,dynamic isGreaterThanOrEqualTo,dynamic arrayContains,List arrayContainsAny,List whereIn,bool isNull,})
//alana göre sırala(varsayılan artan 1..10 , descending = true ise 10..1)
Query orderBy(dynamic field, {bool descending = false})
//START - TABAN - SONRAKİLER
//dahil - at
Query startAt(List values)
Query startAtDocument(DocumentSnapshot documentSnapshot)
//hariç - after
Query startAfter(List values)
Query startAfterDocument(DocumentSnapshot documentSnapshot)
//END - TAVAN - ÖNCEKİLER
//dahil - at
Query endAt(List values)
Query endAtDocument(DocumentSnapshot documentSnapshot)
//hariç - Before
Query endBeforeDocument(DocumentSnapshot documentSnapshot)
Query endBefore(List values)
//getirilecek döküman sayısı
Query limit(int length)
}
14.Query sınıfı için Bütünsel Çıkarım Cümlesi(BÇC):Query sınıfı belirli bir konumdaki veriler üzerinde en geniş sorgu yöntemlerine sahip sorgu sınıfıdır.
15.Ey Yaygın Kritik Parça Tespiti (EYKPT) :QuerySnapshot
16.QuerySnapshot sınıfı için Bütünsel Çıkarım (BÇ):
/// A QuerySnapshot sıfır veya bir çok DocumentSnapshot nesnesi içerebilir
class QuerySnapshot {
/// anlık DocumentSnapshot ların bir listesi
List get document
///değişikliğe uramış DocumentChange nesnelerinin bir listesi
///uygulamada firestore yapılan ilk sorgu sonucu bilgiler ilkkez getirildiyse -ilk snapshot ise bütün dökümanlar listeye eklenir-
List get documentChanges
// değişiklikleri kaydeden SnapshotMetadata nesnesi dödürür
SnapshotMetadata get metadata
}
17.QuerySnapshot sınıfı için Bütünsel Çıkarım Cümlesi(BÇC): QuerySnapshot bir sorgu sonucu dönen dökümanları ve bu dökümanlardan değişikliğe uğramış olanalarını DocumentSnapshot listesi türünde veren yöntemler içeren sınıftır.
DocumentReference: path, id, üst kolleksiyon referansı ve kendisine bağlı alt kollensiyonların referensları gibi daha çok bu dökümanın konumu ve kimliğine ait bilgileri sağlayan yöntemler ile firestorde doğrudan yapılabilen crud operasyonlar olarak isimlendirebileceğimiz okuma, değişikliği dinleme, veri ekleme, güncelleme ve silme yöntemlerini ve ilişkili firestore nesnesini içerir.
Firestore: Firestore bağlantı çekirdek sınıf.
Tüm çaba resmin bu berraklığına ulaşmak içindi…