Bulut Firestore Android Codelab

Hedefler

Bu kod laboratuvarında, Android'de Cloud Firestore tarafından desteklenen bir restoran tavsiye uygulaması oluşturacaksınız. Şunları nasıl yapacağınızı öğreneceksiniz:

  • Bir Android uygulamasından Firestore'a veri okuma ve yazma
  • Firestore verilerindeki değişiklikleri gerçek zamanlı olarak dinleyin
  • Firestore verilerinin güvenliğini sağlamak için Firebase Kimlik Doğrulaması ve güvenlik kurallarını kullanın
  • Karmaşık Firestore sorguları yazın

Önkoşullar

Bu kod laboratuvarına başlamadan önce şunlara sahip olduğunuzdan emin olun:

  • Android Studio 4.0 veya daha
  • Android öykünücüsü
  • Node.js sürüm 10 veya daha yüksek
  • Java sürümü 8 veya üstü
  1. Oturum açın Firebase konsolunda Google hesabınızla.
  2. In Firebase konsolunda , Ekle projeyi tıklayın.
  3. Aşağıdaki ekran yakalama görüldüğü gibi, (örneğin, "Dost Eats") birlikte Firebase proje için bir ad girin ve Devam'ı tıklayın.

9d2f625aebcab6af.png

  1. Google Analytics'i etkinleştirmeniz istenebilir, bu kod laboratuvarının amaçları doğrultusunda seçiminiz önemli değildir.
  2. Bir dakika kadar sonra Firebase projeniz hazır olacak. Devam tıklayın.

Kodu indirin

Bu codelab için örnek kodu klonlamak için aşağıdaki komutu çalıştırın. Bu adında bir klasör oluşturur friendlyeats-android makinenizde:

$ git clone https://github.com/firebase/friendlyeats-android

Makinenizde git yoksa, kodu doğrudan GitHub'dan da indirebilirsiniz.

Android Studio içine projeyi alın. Muhtemelen belki biraz derleme hataları veya eksik hakkında bir uyarı göreceksiniz google-services.json dosyası. Bunu bir sonraki bölümde düzelteceğiz.

Firebase yapılandırması ekle

  1. In Firebase konsolun sol gezinme Proje Özeti seçin. Platformu seçmek için Android butonuna tıklayın. Bir paket adı kullanım istendiğinde com.google.firebase.example.fireeats

73d151ed16016421.png

  1. Kayıt App tıklayın ve indirmek için talimatları izleyin google-services.json dosyası ve içine taşımak app/ örnek kod klasörünün. Ardından İleri'yi tıklayın.

Bu codelab size kullanacağız Firebase Emülatörü Suite yerel Bulut FireStore ve diğer Firebase servisleri taklit etmek. Bu, uygulamanızı oluşturmak için güvenli, hızlı ve ücretsiz bir yerel geliştirme ortamı sağlar.

Firebase CLI'yi yükleyin

Öncelikle yüklemeniz gerekir Firebase CLI . Bunu yapmanın en kolay yolu kullanımı için npm :

npm install -g firebase-tools

Eğer yoksa npm veya Hatayla karşılaşmaya, okumak yükleme talimatlarını sizin platformu için bağımsız bir ikili alır.

Eğer CLI yükledikten sonra, çalışan firebase --version bir sürümünü bildirmelidir 9.0.0 veya daha yüksek:

$ firebase --version
9.0.0

Giriş yapmak

Run firebase login Google hesabınıza CLI bağlamak için. Bu, oturum açma işlemini tamamlamak için yeni bir tarayıcı penceresi açacaktır. Daha önce Firebase projenizi oluştururken kullandığınız hesabı seçtiğinizden emin olun.

İçinden friendlyeats-android klasör çalıştırmak firebase use --add sizin Firebase projesi için yerel projeyi bağlamak için. Daha önce oluşturduğunuz projeyi seçmek için istemleri izleyin ve eğer bir takma ad girmek seçmek istedi default .

Şimdi Firebase Emulator Suite ve FriendlyEats Android uygulamasını ilk kez çalıştırma zamanı.

Emülatörleri çalıştırın

İçinden terminal olarak friendlyeats-android dizin vadede firebase emulators:start Firebase Öykünücüler başlatmak için. Bunun gibi günlükleri görmelisiniz:

$ firebase emulators:start
i  emulators: Starting emulators: auth, firestore
i  firestore: Firestore Emulator logging to firestore-debug.log
i  ui: Emulator UI logging to ui-debug.log

┌─────────────────────────────────────────────────────────────┐
│ ✔  All emulators ready! It is now safe to connect your app. │
│ i  View Emulator UI at http://localhost:4000                │
└─────────────────────────────────────────────────────────────┘

┌────────────────┬────────────────┬─────────────────────────────────┐
│ Emulator       │ Host:Port      │ View in Emulator UI             │
├────────────────┼────────────────┼─────────────────────────────────┤
│ Authentication │ localhost:9099 │ http://localhost:4000/auth      │
├────────────────┼────────────────┼─────────────────────────────────┤
│ Firestore      │ localhost:8080 │ http://localhost:4000/firestore │
└────────────────┴────────────────┴─────────────────────────────────┘
  Emulator Hub running at localhost:4400
  Other reserved ports: 4500

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.

Artık makinenizde çalışan eksiksiz bir yerel geliştirme ortamınız var! Codelab'ın geri kalanı için bu komutu çalışır durumda bıraktığınızdan emin olun, Android uygulamanızın öykünücülere bağlanması gerekir.

Uygulamayı Emülatörlere bağlayın

Dosya açma FirebaseUtil.java Android Studio. Bu dosya, Firebase SDK'larını makinenizde çalışan yerel öykünücülere bağlama mantığını içerir.

Dosyanın en üstünde şu satırı inceleyin:

    /** Use emulators only in debug builds **/
    private static final boolean sUseEmulators = BuildConfig.DEBUG;

Biz kullandığınız BuildConfig bizim app çalışırken biz sadece emülatörlerine bağlanmak emin olmak için debug moduna. Biz app derleme yaparken release modunda bu durum yanlış olacaktır.

Şimdi bir göz atın getFirestore() yöntemiyle:

    public static FirebaseFirestore getFirestore() {
        if (FIRESTORE == null) {
            FIRESTORE = FirebaseFirestore.getInstance();

            // Connect to the Cloud Firestore emulator when appropriate. The host '10.0.2.2' is a
            // special IP address to let the Android emulator connect to 'localhost'.
            if (sUseEmulators) {
                FIRESTORE.useEmulator("10.0.2.2", 8080);
            }
        }

        return FIRESTORE;
    }

Biz kullandığını görebilirsiniz useEmulator(host, port) yerel Firestore emülatörü Firebase SDK'yı bağlamak için yöntem. App boyunca kullanacağımız FirebaseUtil.getFirestore() bu örneğini erişmek için FirebaseFirestore biz çalışırken biz her zaman Firestore emülatörü bağlanıyorsanız emin olacak şekilde debug moduna.

Uygulamayı çalıştırın

Eğer eklediyseniz google-services.json düzgün dosyayı, proje şimdi derlemek gerekir. Android Studio tıklama Build> Projesi Yeniden ve hiçbir kalan hataları olmadığından emin olun.

In Android Studio Run Android emulatörünüzde uygulama. İlk başta bir "Giriş" ekranı ile karşılaşacaksınız. Uygulamaya giriş yapmak için herhangi bir e-posta ve şifreyi kullanabilirsiniz. Bu oturum açma işlemi, Firebase Kimlik Doğrulama öykünücüsüne bağlanıyor, bu nedenle gerçek kimlik bilgileri iletilmiyor.

Şimdi giderek Emulators UI açmak http: // localhost: 4000 web tarayıcınızda. Sonra Doğrulama sekmesine tıklayın ve yeni oluşturduğunuz hesap görmelisiniz:

Firebase Auth Emülatörü

Oturum açma işlemini tamamladıktan sonra uygulama ana ekranını görmelisiniz:

de06424023ffb4b9.png

Yakında ana ekranı doldurmak için bazı veriler ekleyeceğiz.

Bu bölümde, şu anda boş olan ana ekranı doldurabilmemiz için Firestore'a bazı veriler yazacağız.

Bizim app ana modeli nesne bir restoran (bkz olan model/Restaurant.java ). Firestore verileri belgelere, koleksiyonlara ve alt koleksiyonlara bölünür. Biz denilen bir üst düzey koleksiyonunda bir belge olarak her restoran saklayacak "restaurants" . Firestore veri modeli hakkında daha fazla bilgi edinmek için belge ve koleksiyonları hakkında okumak belgeler .

Gösteri amacıyla, taşma menüsünde "Rastgele Öğeler Ekle" düğmesini tıkladığımızda on rastgele restoran oluşturmak için uygulamaya işlevsellik ekleyeceğiz. Dosyasını açın MainActivity.java ve dolgu onAddItemsClicked() yöntemiyle:

    private void onAddItemsClicked() {
        // Get a reference to the restaurants collection
        CollectionReference restaurants = mFirestore.collection("restaurants");

        for (int i = 0; i < 10; i++) {
            // Get a random Restaurant POJO
            Restaurant restaurant = RestaurantUtil.getRandom(this);

            // Add a new document to the restaurants collection
            restaurants.add(restaurant);
        }
    }

Yukarıdaki kod hakkında dikkat edilmesi gereken birkaç önemli nokta vardır:

  • Biz bir başvuru alarak başladı "restaurants" koleksiyonu. Koleksiyonlar, belgeler eklendiğinde örtük olarak oluşturulur, bu nedenle veri yazmadan önce koleksiyonu oluşturmaya gerek yoktur.
  • Belgeler, her Restoran belgesini oluşturmak için kullandığımız POJO'lar kullanılarak oluşturulabilir.
  • add() her Restaurant için benzersiz bir kimlik belirtin gerek yoktu bu yüzden yöntem, otomatik oluşturulmuş kimliğine sahip bir koleksiyona bir belge ekler.

Şimdi uygulamayı tekrar çalıştırın ve az önce yazdığınız kodu çağırmak için taşma menüsündeki "Rastgele Öğeler Ekle" düğmesini tıklayın:

95691e9b71ba55e3.png

Şimdi giderek Emulators UI açmak http: // localhost: 4000 web tarayıcınızda. Sonra Firestore sekmesine tıklayın ve az önce eklediğiniz verileri görmelisiniz:

Firebase Auth Emülatörü

Bu veriler makineniz için %100 yereldir. Aslında, gerçek projeniz henüz bir Firestore veritabanı bile içermiyor! Bu, bu verileri sonuç vermeden değiştirme ve silme denemelerinin güvenli olduğu anlamına gelir.

Tebrikler, Firestore'a az önce veri yazdınız! Bir sonraki adımda, bu verilerin uygulamada nasıl görüntüleneceğini öğreneceğiz.

Bu adımda, Firestore'dan nasıl veri alınacağını ve uygulamamızda nasıl görüntüleneceğini öğreneceğiz. Firestore veri okuma için ilk adım bir oluşturmaktır Query . Değiştirme onCreate() metodu:

        mFirestore = FirebaseUtil.getFirestore();

        // Get the 50 highest rated restaurants
        mQuery = mFirestore.collection("restaurants")
                .orderBy("avgRating", Query.Direction.DESCENDING)
                .limit(LIMIT);

Şimdi, eşleşen tüm belgeleri almak ve gelecekteki güncellemelerden gerçek zamanlı olarak haberdar olmak için sorguyu dinlemek istiyoruz. Bizim nihai hedefimiz bu verileri bağlamak Çünkü RecyclerView , bir oluşturmak için gereken RecyclerView.Adapter verilerine dinlemek için sınıf.

FirestoreAdapter kısmen önce uygulanmış olan sınıf. İlk olarak, adaptör uygulamak yapalım EventListener ve tanımlamak onEvent bir Firestore sorguya güncellemeleri almak böylece fonksiyonu:

public abstract class FirestoreAdapter<VH extends RecyclerView.ViewHolder>
        extends RecyclerView.Adapter<VH>
        implements EventListener<QuerySnapshot> { // Add this "implements"

    // ...

    // Add this method
    @Override
    public void onEvent(QuerySnapshot documentSnapshots,
                        FirebaseFirestoreException e) {

        // Handle errors
        if (e != null) {
            Log.w(TAG, "onEvent:error", e);
            return;
        }

        // Dispatch the event
        for (DocumentChange change : documentSnapshots.getDocumentChanges()) {
            // Snapshot of the changed document
            DocumentSnapshot snapshot = change.getDocument();

            switch (change.getType()) {
                case ADDED:
                    // TODO: handle document added
                    break;
                case MODIFIED:
                    // TODO: handle document modified
                    break;
                case REMOVED:
                    // TODO: handle document removed
                    break;
            }
        }

        onDataChanged();
    }

  // ...
}

İlk yüklemede dinleyici biri alacaktır ADDED her yeni belge için olay. Sorgunun sonuç kümesi zamanla değiştikçe dinleyici, değişiklikleri içeren daha fazla olay alacaktır. Şimdi dinleyiciyi uygulamayı bitirelim. İlk üç yeni yöntemler ekleyin: onDocumentAdded , onDocumentModified ve üzerinde onDocumentRemoved :

    protected void onDocumentAdded(DocumentChange change) {
        mSnapshots.add(change.getNewIndex(), change.getDocument());
        notifyItemInserted(change.getNewIndex());
    }

    protected void onDocumentModified(DocumentChange change) {
        if (change.getOldIndex() == change.getNewIndex()) {
            // Item changed but remained in same position
            mSnapshots.set(change.getOldIndex(), change.getDocument());
            notifyItemChanged(change.getOldIndex());
        } else {
            // Item changed and changed position
            mSnapshots.remove(change.getOldIndex());
            mSnapshots.add(change.getNewIndex(), change.getDocument());
            notifyItemMoved(change.getOldIndex(), change.getNewIndex());
        }
    }

    protected void onDocumentRemoved(DocumentChange change) {
        mSnapshots.remove(change.getOldIndex());
        notifyItemRemoved(change.getOldIndex());
    }

Sonra bu yeni yöntemleri çağırmak onEvent :

    @Override
    public void onEvent(QuerySnapshot documentSnapshots,
                        FirebaseFirestoreException e) {

        // ...

        // Dispatch the event
        for (DocumentChange change : documentSnapshots.getDocumentChanges()) {
            // Snapshot of the changed document
            DocumentSnapshot snapshot = change.getDocument();

            switch (change.getType()) {
                case ADDED:
                    onDocumentAdded(change); // Add this line
                    break;
                case MODIFIED:
                    onDocumentModified(change); // Add this line
                    break;
                case REMOVED:
                    onDocumentRemoved(change); // Add this line
                    break;
            }
        }

        onDataChanged();
    }

Son olarak uygulamak startListening() dinleyici takmak için yöntem:

    public void startListening() {
        if (mQuery != null && mRegistration == null) {
            mRegistration = mQuery.addSnapshotListener(this);
        }
    }

Artık uygulama, Firestore'dan veri okumak için tamamen yapılandırılmıştır. Uygulamayı tekrar çalıştırın ve önceki adımda eklenen restoranlar görmelisiniz:

9e45f40faefce5d0.png

Şimdi tarayıcınızdaki Emulator kullanıcı arayüzüne geri dönün ve restoran adlarından birini düzenleyin. Uygulamada neredeyse anında değiştiğini görmelisiniz!

Uygulama şu anda tüm koleksiyondaki en yüksek puanlı restoranları gösteriyor, ancak gerçek bir restoran uygulamasında kullanıcı verileri sıralamak ve filtrelemek isteyecektir. Örneğin, uygulama "Philadelphia'daki en iyi deniz ürünleri restoranları" veya "En ucuz pizza"yı gösterebilmelidir.

Uygulamanın üst kısmındaki beyaz çubuğa tıklamak, bir filtreler iletişim kutusu açar. Bu bölümde, bu iletişim kutusunun çalışması için Firestore sorgularını kullanacağız:

67898572a35672a5.png

Hadi düzenlemek onFilter() metodu MainActivity.java . Bu yöntem kabul Filters biz filtreler iletişim kutusunun çıkış yakalamak için oluşturulmuş bir yardımcı nesnesidir nesne. Filtrelerden bir sorgu oluşturmak için bu yöntemi değiştireceğiz:

    @Override
    public void onFilter(Filters filters) {
        // Construct query basic query
        Query query = mFirestore.collection("restaurants");

        // Category (equality filter)
        if (filters.hasCategory()) {
            query = query.whereEqualTo("category", filters.getCategory());
        }

        // City (equality filter)
        if (filters.hasCity()) {
            query = query.whereEqualTo("city", filters.getCity());
        }

        // Price (equality filter)
        if (filters.hasPrice()) {
            query = query.whereEqualTo("price", filters.getPrice());
        }

        // Sort by (orderBy with direction)
        if (filters.hasSortBy()) {
            query = query.orderBy(filters.getSortBy(), filters.getSortDirection());
        }

        // Limit items
        query = query.limit(LIMIT);

        // Update the query
        mQuery = query;
        mAdapter.setQuery(query);

        // Set header
        mCurrentSearchView.setText(Html.fromHtml(filters.getSearchDescription(this)));
        mCurrentSortByView.setText(filters.getOrderDescription(this));

        // Save filters
        mViewModel.setFilters(filters);
    }

Yukarıdaki Parçacık in bir inşa Query takarak nesne where ve orderBy verilen filtreleri eşleştirmek için maddeler.

Uygulamayı tekrar çalıştırın ve en popüler düşük fiyatlı restoranları göstermek için aşağıdaki filtreyi seçin:

7a67a8a400c80c50.png

Artık yalnızca düşük fiyatlı seçenekleri içeren filtrelenmiş bir restoran listesi görmelisiniz:

a670188398c3c59.png

Buraya kadar geldiyseniz, artık Firestore'da tam işlevli bir restoran tavsiyesi görüntüleme uygulaması oluşturmuşsunuzdur! Artık restoranları gerçek zamanlı olarak sıralayabilir ve filtreleyebilirsiniz. Sonraki birkaç bölümde, uygulamaya incelemeler ve güvenlik göndereceğiz.

Bu bölümde, kullanıcıların favori (veya en az favori) restoranlarını gözden geçirebilmeleri için uygulamaya derecelendirmeler ekleyeceğiz.

Koleksiyonlar ve alt koleksiyonlar

Şimdiye kadar tüm restoran verilerini "restoranlar" adı verilen üst düzey bir koleksiyonda sakladık. Bir kullanıcı oranları bir restoran yeni bir eklemek istediğinizde Rating restoranlar nesneyi. Bu görev için bir alt koleksiyon kullanacağız. Bir alt koleksiyonu, bir belgeye eklenmiş bir koleksiyon olarak düşünebilirsiniz. Böylece her restoran belgesi, derecelendirme belgeleriyle dolu bir derecelendirme alt koleksiyonuna sahip olacaktır. Alt koleksiyonlar, belgelerimizi şişirmeden veya karmaşık sorgular gerektirmeden verileri düzenlemeye yardımcı olur.

Bir subcollection, çağrı erişmek için .collection() ana belge üzerinde:

CollectionReference subRef = mFirestore.collection("restaurants")
        .document("abc123")
        .collection("ratings");

Üst düzey bir koleksiyonda olduğu gibi bir alt koleksiyona erişebilir ve sorgulayabilirsiniz, boyut sınırlaması veya performans değişikliği yoktur. Sen Firestore veri modeli hakkında daha fazla bilgi bulabilirsiniz burada .

Bir işlemde veri yazma

Bir ekleme Rating uygun subcollection sadece çağıran gerektirir .add() , ama biz de güncellemeniz gerekir Restaurant yeni veri yansıtacak şekilde nesnenin ortalama puanı ve değerlendirmesi sayısını. Bu iki değişikliği yapmak için ayrı işlemler kullanırsak, eski veya yanlış verilerle sonuçlanabilecek bir dizi yarış koşulu vardır.

Puanların doğru şekilde eklendiğinden emin olmak için bir restorana puan eklemek için bir işlem kullanacağız. Bu işlem birkaç işlem gerçekleştirecektir:

  • Restoranın mevcut puanını okuyun ve yenisini hesaplayın
  • Derecelendirmeyi alt koleksiyona ekleyin
  • Restoranın ortalama puanını ve puan sayısını güncelleyin

Açık RestaurantDetailActivity.java ve uygulamak addRating fonksiyonu:

    private Task<Void> addRating(final DocumentReference restaurantRef,
                                 final Rating rating) {
        // Create reference for new rating, for use inside the transaction
        final DocumentReference ratingRef = restaurantRef.collection("ratings")
                .document();

        // In a transaction, add the new rating and update the aggregate totals
        return mFirestore.runTransaction(new Transaction.Function<Void>() {
            @Override
            public Void apply(Transaction transaction)
                    throws FirebaseFirestoreException {

                Restaurant restaurant = transaction.get(restaurantRef)
                        .toObject(Restaurant.class);

                // Compute new number of ratings
                int newNumRatings = restaurant.getNumRatings() + 1;

                // Compute new average rating
                double oldRatingTotal = restaurant.getAvgRating() *
                        restaurant.getNumRatings();
                double newAvgRating = (oldRatingTotal + rating.getRating()) /
                        newNumRatings;

                // Set new restaurant info
                restaurant.setNumRatings(newNumRatings);
                restaurant.setAvgRating(newAvgRating);

                // Commit to Firestore
                transaction.set(restaurantRef, restaurant);
                transaction.set(ratingRef, rating);

                return null;
            }
        });
    }

addRating() işlevi, bir döner Task tüm hareket temsil eder. In onRating() fonksiyonu dinleyicileri işlemin sonucuna yanıt verdiklerini göreve eklenir.

Şimdi uygulamayı tekrar çalıştırın ve restoran detay ekranı getirecektir restoranlar, birine tıklayın. Bir inceleme eklemeye başlamak için + düğmesine tıklayın. Birkaç yıldız seçip bir metin girerek bir inceleme ekleyin.

78fa16cdf8ef435a.png

İşlem başlayacak Gönder vurmak. İşlem tamamlandığında, yorumunuzun aşağıda görüntülendiğini ve restoranın yorum sayısında bir güncelleme göreceksiniz:

f9e670f40bd615b0.png

Tebrikler! Artık Cloud Firestore üzerine kurulu sosyal, yerel, mobil bir restoran inceleme uygulamanız var. Bu aralar çok popüler olduğunu duydum.

Şimdiye kadar bu uygulamanın güvenliğini düşünmedik. Kullanıcıların yalnızca kendi doğru verilerini okuyup yazabildiklerini nereden biliyoruz? Firestore datbases adlı bir yapılandırma dosyası ile teminat altına alınmıştır Güvenlik Kuralları .

firestore.rules dosyasını aşağıdaki görmelisiniz:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      //
      // WARNING: These rules are insecure! We will replace them with
      // more secure rules later in the codelab
      //
      allow read, write: if request.auth != null;
    }
  }
}

Bu kurallar edelim değişim, acesss veya değişiklik istenmeyen verileri önlemek açmak için firestore.rules dosyası ve aşağıdaki içerik değiştirin:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Determine if the value of the field "key" is the same
    // before and after the request.
    function isUnchanged(key) {
      return (key in resource.data)
        && (key in request.resource.data)
        && (resource.data[key] == request.resource.data[key]);
    }

    // Restaurants
    match /restaurants/{restaurantId} {
      // Any signed-in user can read
      allow read: if request.auth != null;

      // Any signed-in user can create
      // WARNING: this rule is for demo purposes only!
      allow create: if request.auth != null;

      // Updates are allowed if no fields are added and name is unchanged
      allow update: if request.auth != null
                    && (request.resource.data.keys() == resource.data.keys())
                    && isUnchanged("name");

      // Deletes are not allowed.
      // Note: this is the default, there is no need to explicitly state this.
      allow delete: if false;

      // Ratings
      match /ratings/{ratingId} {
        // Any signed-in user can read
        allow read: if request.auth != null;

        // Any signed-in user can create if their uid matches the document
        allow create: if request.auth != null
                      && request.resource.data.userId == request.auth.uid;

        // Deletes and updates are not allowed (default)
        allow update, delete: if false;
      }
    }
  }
}

Bu kurallar, istemcilerin yalnızca güvenli değişiklikler yapmasını sağlamak için erişimi kısıtlar. Örneğin, bir restoran belgesindeki güncellemeler, adı veya diğer değişmez verileri değil, yalnızca derecelendirmeleri değiştirebilir. Derecelendirmeler, yalnızca kullanıcı kimliği, oturum açmış olan kullanıcıyla eşleşirse oluşturulabilir, bu da sahtekarlığı önler.

Güvenlik Kuralları hakkında daha fazla bilgi için aşağıdaki adresi ziyaret belgelere .

Artık Firestore'un üzerinde tam özellikli bir uygulama oluşturdunuz. Aşağıdakiler dahil en önemli Firestore özelliklerini öğrendiniz:

  • Belgeler ve koleksiyonlar
  • Veri okuma ve yazma
  • Sorgularla sıralama ve filtreleme
  • alt koleksiyonlar
  • işlemler

Daha fazla bilgi edin

Firestore hakkında bilgi edinmeye devam etmek için, başlamak için bazı iyi yerler şunlardır:

Bu codelab'deki restoran uygulaması, "Friendly Eats" örnek uygulamasını temel almıştır. Sen söz konusu uygulamaya ilişkin kaynak kodunu göz atabilirsiniz burada .

İsteğe bağlı: Üretime dağıtın

Şimdiye kadar bu uygulama yalnızca Firebase Emulator Suite'i kullandı. Bu uygulamayı gerçek bir Firebase projesine nasıl dağıtacağınızı öğrenmek istiyorsanız bir sonraki adıma geçin.

Şimdiye kadar bu uygulama tamamen yereldi, tüm veriler Firebase Emulator Suite'te bulunuyor. Bu bölümde, bu uygulamanın üretimde çalışması için Firebase projenizi nasıl yapılandıracağınızı öğreneceksiniz.

Firebase Kimlik Doğrulaması

Firebase In Kimlik Doğrulama bölümüne ve gezindiğini gidin consle Sign-in Sağlayıcıları sekmesine .

E-posta ile oturum açma yöntemini etkinleştirin:

334ef7f6ff4da4ce.png

itfaiye

Veritabanı yarat

Gezin konsolunun Firestore bölümüne ve veritabanı oluşturma tıklayın:

  1. Güvenlik Kuralları Kilitli modda başlatmak için seçim hakkında sorulduğunda, yakında bu kuralları güncelleyeceğiz.
  2. Uygulamanız için kullanmak istediğiniz veritabanı konumunu seçin. Bir veritabanı konumu kalıcı bir karardır bu seçimi unutmayın ve bunu değiştirmek için yeni bir proje oluşturmak zorunda kalacaktır. Bir proje konumu seçme hakkında daha fazla bilgi için bkz belgelere .

Dağıtım Kuralları

Daha önce yazdığınız Güvenlik Kurallarını dağıtmak için codelab dizininde aşağıdaki komutu çalıştırın:

$ firebase deploy --only firestore:rules

Bu içeriğini dağıtmak olacaktır firestore.rules Konsolda Kurallar sekmesine giderek onaylayabilirsiniz projeniz için.

Dizinleri Dağıt

FriendlyEats uygulaması, bir dizi özel bileşik dizin gerektiren karmaşık sıralama ve filtrelemeye sahiptir. Bunlar Firebase konsolunda elle oluşturulan ancak onların tanımlarını yazmak için basittir edilebilir firestore.indexes.json dosyası ve Firebase CLI kullanarak bunları dağıtın.

Eğer açarsanız firestore.indexes.json dosyasını gerekli dizin zaten sağlanmış olduğunu göreceksiniz:

{
  "indexes": [
    {
      "collectionId": "restaurants",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "city", "mode": "ASCENDING" },
        { "fieldPath": "avgRating", "mode": "DESCENDING" }
      ]
    },
    {
      "collectionId": "restaurants",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "category", "mode": "ASCENDING" },
        { "fieldPath": "avgRating", "mode": "DESCENDING" }
      ]
    },
    {
      "collectionId": "restaurants",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "price", "mode": "ASCENDING" },
        { "fieldPath": "avgRating", "mode": "DESCENDING" }
      ]
    },
    {
      "collectionId": "restaurants",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "city", "mode": "ASCENDING" },
        { "fieldPath": "numRatings", "mode": "DESCENDING" }
      ]
    },
    {
      "collectionId": "restaurants",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "category", "mode": "ASCENDING" },
        { "fieldPath": "numRatings", "mode": "DESCENDING" }
      ]
    },
    {
      "collectionId": "restaurants",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "price", "mode": "ASCENDING" },
        { "fieldPath": "numRatings", "mode": "DESCENDING" }
      ]
    },
    {
      "collectionId": "restaurants",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "city", "mode": "ASCENDING" },
        { "fieldPath": "price", "mode": "ASCENDING" }
      ]
    },
    {
      "collectionId": "restaurants",
      "fields": [
        { "fieldPath": "category", "mode": "ASCENDING" },
        { "fieldPath": "price", "mode": "ASCENDING" }
      ]
    }
  ],
  "fieldOverrides": []
}

Bu dizinleri dağıtmak için aşağıdaki komutu çalıştırın:

$ firebase deploy --only firestore:indexes

Dizin oluşturmanın anlık olmadığını unutmayın, ilerlemeyi Firebase konsolunda izleyebilirsiniz.

Uygulamayı yapılandırın

In FirebaseUtil sınıfının biz hata ayıklama modunda emülatörlerine bağlantı için Firebase SDK yapılandırılmış:

public class FirebaseUtil {

    /** Use emulators only in debug builds **/
    private static final boolean sUseEmulators = BuildConfig.DEBUG;

    // ...
}

Uygulamanızı gerçek Firebase projenizle test etmek isterseniz, şunları yapabilirsiniz:

  1. Uygulamayı yayın modunda oluşturun ve bir cihazda çalıştırın.
  2. Geçici olarak değiştirmek sUseEmulators için false ve uygulamayı tekrar çalıştırın.

Uygulamanın Oturumu ve düzgün üretime bağlanmak için tekrar oturum açmanız gerekebilir unutmayın.