ক্লাউড ফায়ারস্টোর অ্যান্ড্রয়েড কোডল্যাব

লক্ষ্য

এই কোডল্যাবে আপনি ক্লাউড ফায়ারস্টোর দ্বারা সমর্থিত অ্যান্ড্রয়েডে একটি রেস্তোরাঁ সুপারিশ অ্যাপ্লিকেশন তৈরি করবেন। আপনি শিখবেন কিভাবে:

  • একটি অ্যান্ড্রয়েড অ্যাপ থেকে ফায়ারস্টোরে ডেটা পড়ুন এবং লিখুন
  • রিয়েলটাইমে ফায়ারস্টোর ডেটার পরিবর্তনগুলি শুনুন
  • ফায়ারস্টোর ডেটা সুরক্ষিত করতে Firebase প্রমাণীকরণ এবং নিরাপত্তা নিয়ম ব্যবহার করুন
  • জটিল ফায়ারস্টোর প্রশ্ন লিখুন

পূর্বশর্ত

এই কোডল্যাব শুরু করার আগে নিশ্চিত করুন যে আপনার আছে:

  • অ্যান্ড্রয়েড স্টুডিও 4.0 বা উচ্চতর
  • একটি অ্যান্ড্রয়েড এমুলেটর
  • Node.js সংস্করণ 10 বা উচ্চতর
  • জাভা সংস্করণ 8 বা উচ্চতর
  1. সাইন ইন করুন Firebase কনসোল আপনার Google অ্যাকাউন্টের সাথে।
  2. ইন Firebase কনসোল , প্রকল্প যোগ করুন।
  3. যখন নীচে স্ক্রিন ক্যাপচার দেখানো, আপনার Firebase প্রকল্পের জন্য একটি নাম লিখুন (যেমন, "বন্ধুত্বপূর্ণ খাওয়া"), এবং অবিরত ক্লিক করুন।

9d2f625aebcab6af.png

  1. আপনাকে গুগল অ্যানালিটিক্স সক্ষম করতে বলা হতে পারে, এই কোডল্যাবের উদ্দেশ্যে আপনার নির্বাচন কোন ব্যাপার না।
  2. এক মিনিট বা তারও পরে, আপনার ফায়ারবেস প্রকল্প প্রস্তুত হয়ে যাবে। অবিরত ক্লিক করুন।

কোডটি ডাউনলোড করুন

এই কোডল্যাবের নমুনা কোড ক্লোন করতে নিম্নলিখিত কমান্ডটি চালান। এই একটি ফোল্ডার নামক তৈরি করবে friendlyeats-android আপনার মেশিনে:

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

যদি আপনার মেশিনে গিট না থাকে, আপনি সরাসরি গিটহাব থেকে কোডটি ডাউনলোড করতে পারেন।

অ্যান্ড্রয়েড স্টুডিও মধ্যে প্রকল্পের আমদানি করুন। আপনি সম্ভবত কিছু সংকলন ত্রুটি বা হয়তো অনুপস্থিত সম্পর্কে একটি সতর্কতা দেখতে পাবেন google-services.json ফাইল। আমরা পরবর্তী বিভাগে এটি সংশোধন করব।

Firebase কনফিগারেশন যোগ করুন

  1. ইন Firebase কনসোল , বাম এনএভি মধ্যে Project সংক্ষিপ্ত বিবরণ নির্বাচন করুন। প্ল্যাটফর্ম নির্বাচন করতে অ্যান্ড্রয়েড বোতামে ক্লিক করুন। একটি প্যাকেজ নামটি করার অনুরোধ জানানো হলে com.google.firebase.example.fireeats

73d151ed16016421.png

  1. নিবন্ধন অ্যাপ ক্লিক করুন এবং ডাউনলোড করতে নির্দেশাবলী অনুসরণ করুন google-services.json ফাইল, এবং এটি সরাতে app/ নমুনা কোডের ফোল্ডার। তারপর Next ক্লিক করুন।

এই codelab আপনি ব্যবহার করব Firebase এমুলেটর সুইট স্থানীয়ভাবে মেঘ Firestore এবং অন্যান্য Firebase সেবা অনুকরণ। এটি আপনার অ্যাপ তৈরির জন্য একটি নিরাপদ, দ্রুত এবং বিনামূল্যে স্থানীয় উন্নয়ন পরিবেশ প্রদান করে।

Firebase CLI ইনস্টল করুন

প্রথমে ইনস্টল করতে হবে Firebase CLI । এই কাজ করতে সবচেয়ে সহজ উপায় ব্যবহার করা npm :

npm install -g firebase-tools

আপনি না থাকলে npm অথবা আপনি এখনও সমস্যার সম্মুখীন পড়তে ইনস্টলেশন সংক্রান্ত নির্দেশাবলী আপনার প্ল্যাটফর্মের জন্য একটি স্বতন্ত্র বাইনারি জন্য।

একবার আপনি CLI ইনস্টল, দৌড়ানো firebase --version একটি সংস্করণ জানানো উচিত 9.0.0 বা উচ্চতর:

$ firebase --version
9.0.0

প্রবেশ করুন

চালান firebase login আপনার Google অ্যাকাউন্টে CLI সংযোগ স্থাপন করতে। এটি লগইন প্রক্রিয়া সম্পন্ন করার জন্য একটি নতুন ব্রাউজার উইন্ডো খুলবে। আগে আপনার ফায়ারবেস প্রজেক্ট তৈরির সময় আপনি যে অ্যাকাউন্টটি ব্যবহার করেছিলেন তা চয়ন করুন।

মধ্যে থেকে friendlyeats-android ফোল্ডারের রান firebase use --add আপনার Firebase প্রকল্পে আপনার স্থানীয় প্রকল্প সংযোগ স্থাপন করতে। প্রকল্পের আপনি আগে নির্মিত নির্বাচন করতে অনুরোধ জানানো এবং যদি উপনাম প্রবেশ চয়ন করতে বলা default

এখনই প্রথমবারের মতো Firebase Emulator Suite এবং FriendlyEats Android অ্যাপ চালানোর সময় এসেছে।

এমুলেটর চালান

ভিতর থেকে আপনার টার্মিনালে friendlyeats-android ডিরেক্টরির রান firebase emulators:start Firebase emulators আরম্ভ করা হয়। আপনি এই মত লগ দেখতে হবে:

$ 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.

আপনার মেশিনে এখন একটি সম্পূর্ণ স্থানীয় উন্নয়ন পরিবেশ চলছে! এই কমান্ডটি বাকি কোডল্যাবের জন্য চলতে ভুলবেন না, আপনার অ্যান্ড্রয়েড অ্যাপকে এমুলেটরগুলির সাথে সংযোগ করতে হবে।

ইমুলেটরদের সাথে অ্যাপটি সংযুক্ত করুন

ফাইল খুলুন FirebaseUtil.java অ্যান্ড্রয়েড স্টুডিওতে। এই ফাইলে আপনার মেশিনে চলমান স্থানীয় এমুলেটরগুলির সাথে ফায়ারবেস এসডিকে সংযুক্ত করার যুক্তি রয়েছে।

ফাইলের শীর্ষে, এই লাইনটি পরীক্ষা করুন:

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

আমরা ব্যবহার করছেন BuildConfig নিশ্চিত যখন আমাদের app এর মধ্যে চলমান আমরা কেবল emulators সাথে সংযোগ করতে debug মোড। আমরা অ্যাপ কম্পাইল যখন release মোড এই অবস্থা মিথ্যা হবে।

এখন কটাক্ষপাত করা getFirestore() পদ্ধতি:

    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;
    }

আমরা দেখতে পারি যে এটি ব্যবহার করছে useEmulator(host, port) পদ্ধতি স্থানীয় Firestore এমুলেটর করার Firebase SDK এর সংযোগ স্থাপন করতে। অ্যাপ্লিকেশন সর্বত্র আমরা ব্যবহার করবে FirebaseUtil.getFirestore() এই ক্ষেত্রটিকেই অ্যাক্সেস করতে FirebaseFirestore তাই আমরা নিশ্চিত যে আমরা সবসময় যখন চলমান Firestore এমুলেটর সঙ্গে সংযোগ স্থাপন করছে হয় debug মোড।

অ্যাপটি চালান

আপনাকে জুড়েছে তাহলে google-services.json ফাইল সঠিকভাবে, প্রকল্প এখন কম্পাইল করা উচিত নয়। অ্যান্ড্রয়েড স্টুডিও ক্লিক Build এ> প্রকল্প পুনর্নির্মাণ এবং নিশ্চিত কোন অবশিষ্ট ত্রুটি রয়েছে।

Android এ স্টুডিও চালান আপনার অ্যান্ড্রয়েড এমুলেটর উপর অ্যাপ্লিকেশন। প্রথমে আপনাকে একটি "সাইন ইন" স্ক্রিন উপস্থাপন করা হবে। আপনি অ্যাপটিতে প্রবেশ করতে যেকোনো ইমেইল এবং পাসওয়ার্ড ব্যবহার করতে পারেন। এই সাইন ইন প্রক্রিয়াটি ফায়ারবেস প্রমাণীকরণ এমুলেটরের সাথে সংযোগ স্থাপন করছে, তাই কোন প্রকৃত শংসাপত্র প্রেরণ করা হচ্ছে না।

এখন নেভিগেট করে emulators UI 'তে খুলতে 4000 করুন: http: // স্থানীয় হোস্ট আপনার ওয়েব ব্রাউজারে। তারপর প্রমাণীকরণ ট্যাবে ক্লিক করুন এবং আপনি শুধু তৈরি করা অ্যাকাউন্টের দেখতে পাবেন:

Firebase Auth Emulator

একবার আপনি সাইন ইন প্রক্রিয়া সম্পন্ন করলে আপনার অ্যাপের হোম স্ক্রিন দেখা উচিত:

de06424023ffb4b9.png

শীঘ্রই আমরা হোম স্ক্রিন পপুলেট করার জন্য কিছু তথ্য যোগ করব।

এই বিভাগে আমরা ফায়ারস্টোরে কিছু ডেটা লিখব যাতে আমরা বর্তমানে খালি হোম স্ক্রিন পপুলেট করতে পারি।

আমাদের অ্যাপ্লিকেশন প্রধান মডেল বস্তুর একটি রেস্টুরেন্ট (দেখতে model/Restaurant.java )। ফায়ারস্টোর ডেটা ডকুমেন্ট, কালেকশন এবং সাবকলেকশনে বিভক্ত। আমরা একটি টপ লেভেল সংগ্রহ নামক একটি নথি হিসাবে একে রেস্টুরেন্টে সংরক্ষণ করবে "restaurants" । Firestore তথ্য মডেল সম্পর্কে আরো জানতে, নথি এবং সংগ্রহের সম্পর্কে পড়তে ডকুমেন্টেশন

প্রদর্শনের উদ্দেশ্যে, আমরা ওভারফ্লো মেনুতে "এলোমেলো আইটেম যুক্ত করুন" বোতামটি ক্লিক করলে আমরা দশটি এলোমেলো রেস্তোরাঁ তৈরি করতে অ্যাপটিতে কার্যকারিতা যুক্ত করব। ফাইল খুলুন MainActivity.java এবং ভরাট onAddItemsClicked() পদ্ধতি:

    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);
        }
    }

উপরের কোডটি সম্পর্কে কিছু গুরুত্বপূর্ণ বিষয় লক্ষ্য করুন:

  • আমরা একটি রেফারেন্স পেয়ে শুরু "restaurants" সংগ্রহ। ডকুমেন্ট যুক্ত করার সময় সংগ্রহগুলি নিখুঁতভাবে তৈরি করা হয়, তাই ডেটা লেখার আগে সংগ্রহ তৈরি করার দরকার ছিল না।
  • POJO ব্যবহার করে ডকুমেন্ট তৈরি করা যেতে পারে, যা আমরা প্রতিটি রেস্টুরেন্ট ডক তৈরি করতে ব্যবহার করি।
  • add() পদ্ধতি তাই আমরা প্রতিটি রেঁস্তোরা জন্য একটি অনন্য ID উল্লেখ করার প্রয়োজন ছিল না, একটি স্বয়ংক্রিয়ভাবে তৈরি আইডি দিয়ে একটি সংগ্রহে একটি নথি যোগ করা হয়েছে।

এখন আবার অ্যাপটি চালান এবং ওভারফ্লো মেনুতে "অ্যাড র্যান্ডম আইটেমস" বোতামে ক্লিক করুন যাতে আপনি শুধু যে কোডটি লিখেছেন তা চালু করতে পারেন:

95691e9b71ba55e3.png

এখন নেভিগেট করে emulators UI 'তে খুলতে 4000 করুন: http: // স্থানীয় হোস্ট আপনার ওয়েব ব্রাউজারে। তারপর Firestore ট্যাবে ক্লিক করুন এবং আপনি ডাটা আপনি শুধু যোগ করেছে তা দেখুন উচিত:

Firebase Auth Emulator

এই ডেটা আপনার মেশিনে 100% স্থানীয়। আসলে, আপনার আসল প্রকল্পটি এখনও একটি ফায়ারস্টোর ডাটাবেস ধারণ করে না! এর মানে এই যে, এই ডেটা পরিবর্তন এবং মুছে ফেলা ছাড়া কোনো ফলাফল ছাড়াই পরীক্ষা করা নিরাপদ।

অভিনন্দন, আপনি শুধু ফায়ারস্টোরে ডেটা লিখেছেন! পরবর্তী ধাপে আমরা শিখব কিভাবে অ্যাপে এই ডেটা প্রদর্শন করতে হয়।

এই ধাপে আমরা শিখব কিভাবে ফায়ারস্টোর থেকে ডেটা উদ্ধার করা যায় এবং আমাদের অ্যাপে এটি প্রদর্শন করা যায়। Firestore থেকে ডেটা পড়ার প্রথম পদক্ষেপ হল একটি তৈরি করা Query । পরিবর্তন করুন onCreate() পদ্ধতি:

        mFirestore = FirebaseUtil.getFirestore();

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

এখন আমরা ক্যোয়ারী শুনতে চাই, যাতে আমরা সব মিলে যাওয়া ডকুমেন্ট পাই এবং রিয়েল টাইমে ভবিষ্যতের আপডেট সম্পর্কে অবহিত হই। কারণ আমাদের পরিণামস্বরূপ লক্ষ্য একটি এই তথ্য বাঁধে হয় RecyclerView , আমরা একটি তৈরি করতে হবে RecyclerView.Adapter বর্গ তথ্য শোনার জন্য।

খুলুন FirestoreAdapter বর্গ, যা আংশিকভাবে ইতিমধ্যে বাস্তবায়িত হয়েছে। প্রথমত, এর এডাপটার বাস্তবায়ন করি EventListener এবং সংজ্ঞায়িত onEvent ফাংশন যাতে এটি একটি Firestore ক্যোয়ারী যাও যাও আপডেট প্রাপ্ত করতে পারেন:

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();
    }

  // ...
}

প্রাথমিক লোড উপর শ্রোতা এক পাবেন ADDED প্রতিটি নতুন নথির জন্য ইভেন্ট। সময়ের সাথে সাথে প্রশ্নের ফলাফলের সেট পরিবর্তিত হওয়ার সাথে সাথে শ্রোতা পরিবর্তনগুলি সহ আরও ইভেন্ট পাবেন। এখন শ্রোতা বাস্তবায়ন শেষ করা যাক। প্রথম তিনটি নতুন পদ্ধতি যোগ করুন: onDocumentAdded , onDocumentModified , এবং 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());
    }

তারপর থেকে এই নতুন পদ্ধতি কল 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();
    }

অবশেষে বাস্তবায়ন startListening() শ্রোতা সংযুক্ত করতে পদ্ধতি:

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

এখন অ্যাপটি ফায়ারস্টোর থেকে ডেটা পড়ার জন্য সম্পূর্ণরূপে কনফিগার করা হয়েছে। আবার অ্যাপ্লিকেশান চালু করুন এবং আপনার রেস্টুরেন্ট আগের পদক্ষেপে আপনার যোগ করেছে তা দেখুন উচিত:

9e45f40faefce5d0.png

এখন আপনার ব্রাউজারে এমুলেটর UI এ ফিরে যান এবং রেস্টুরেন্টের নামগুলির একটি সম্পাদনা করুন। আপনি এটি প্রায় তাত্ক্ষণিকভাবে অ্যাপ্লিকেশন পরিবর্তন দেখতে হবে!

অ্যাপটি বর্তমানে পুরো সংগ্রহ জুড়ে শীর্ষ-রেটযুক্ত রেস্তোরাঁগুলি প্রদর্শন করে, কিন্তু একটি বাস্তব রেস্তোরাঁ অ্যাপে ব্যবহারকারী ডেটা সাজাতে এবং ফিল্টার করতে চায়। উদাহরণস্বরূপ অ্যাপটি "ফিলাডেলফিয়ার শীর্ষ সামুদ্রিক খাবার রেস্তোরাঁ" বা "সর্বনিম্ন ব্যয়বহুল পিৎজা" দেখাতে সক্ষম হওয়া উচিত।

অ্যাপের শীর্ষে সাদা বার ক্লিক করলে একটি ফিল্টার ডায়ালগ আসে। এই বিভাগে আমরা এই ডায়ালগ কাজ করতে Firestore প্রশ্ন ব্যবহার করব:

67898572a35672a5.png

আসুন সম্পাদনার onFilter() পদ্ধতি MainActivity.java । এই পদ্ধতি একটি গ্রহণ Filters বস্তুর যা সাহায্যকারী বস্তুর আমরা ফিল্টার ডায়ালগের আউটপুট গ্রহণ করে তৈরি করা হয়। আমরা ফিল্টার থেকে একটি প্রশ্ন তৈরি করতে এই পদ্ধতি পরিবর্তন করব:

    @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);
    }

উপরে স্নিপেট আমরা একটি বিল্ড Query যুক্ত করে বস্তুর where এবং orderBy দেওয়া ফিল্টার মেলে ক্লজ।

আবার অ্যাপ্লিকেশান চালু করুন এবং সবচেয়ে জনপ্রিয় কম মূল্য রেস্টুরেন্ট দেখানোর জন্য নিম্নলিখিত ফিল্টার নির্বাচন করুন:

7a67a8a400c80c50.png

আপনার এখন রেস্তোরাঁগুলির একটি ফিল্টার করা তালিকা দেখা উচিত যেখানে কেবল কম দামের বিকল্প রয়েছে:

a670188398c3c59.png

আপনি যদি এটি এতদূর তৈরি করে থাকেন তবে আপনি এখন একটি সম্পূর্ণরূপে কার্যকরী রেস্তোরাঁ সুপারিশ দেখার অ্যাপ তৈরি করেছেন ফায়ারস্টোরে! আপনি এখন রিয়েল টাইমে রেস্টুরেন্ট সাজাতে এবং ফিল্টার করতে পারেন। পরবর্তী কয়েকটি বিভাগে আমরা অ্যাপটিতে পর্যালোচনা এবং নিরাপত্তা পোস্ট করছি।

এই বিভাগে আমরা অ্যাপটিতে রেটিং যোগ করব যাতে ব্যবহারকারীরা তাদের পছন্দের (বা কমপক্ষে প্রিয়) রেস্তোরাঁগুলি পর্যালোচনা করতে পারে।

সংগ্রহ এবং উপ -সংগ্রহ

এখন পর্যন্ত আমরা "রেস্টুরেন্ট" নামে একটি শীর্ষ স্তরের সংগ্রহে সমস্ত রেস্তোঁরা ডেটা সংরক্ষণ করেছি। একটি ব্যবহারকারী হার একটি রেস্টুরেন্টে আমরা একটি নতুন যোগ করতে চান যখন Rating রেস্তোরাঁয় অবজেক্ট। এই কাজের জন্য আমরা একটি সাবকলেকশন ব্যবহার করব। আপনি একটি উপ -সংগ্রহকে একটি সংগ্রহ হিসাবে বিবেচনা করতে পারেন যা একটি নথির সাথে সংযুক্ত। সুতরাং প্রতিটি রেস্তোরাঁর নথিতে রেটিং নথিতে পূর্ণ একটি রেটিং উপ -সংগ্রহ থাকবে। উপ -সংগ্রহগুলি আমাদের নথিপত্র না ফুটিয়ে বা জটিল প্রশ্নের প্রয়োজন ছাড়াই ডেটা সংগঠিত করতে সহায়তা করে।

একটি subcollection, কল অ্যাক্সেস করতে .collection() পিতা বা মাতা দস্তাবেজে:

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

আপনি একটি শীর্ষ-স্তরের সংগ্রহের মতো একটি উপ-সংগ্রহ অ্যাক্সেস এবং জিজ্ঞাসা করতে পারেন, কোন আকার সীমাবদ্ধতা বা কর্মক্ষমতা পরিবর্তন নেই। আপনি Firestore তথ্য মডেল সম্বন্ধে আরও পড়তে পারেন এখানে

লেনদেনে ডেটা লেখা

একটি যোগ করার পদ্ধতি Rating সঠিক subcollection একমাত্র কলিং প্রয়োজন .add() , কিন্তু আমরা আপডেট করতে হবে Restaurant বস্তুর গড় রেটিং এবং রেটিং সংখ্যা নতুন তথ্য প্রতিফলিত। যদি আমরা এই দুটি পরিবর্তন করার জন্য আলাদা অপারেশন ব্যবহার করি তবে সেখানে বেশ কয়েকটি জাতিগত অবস্থা রয়েছে যার ফলে বাসি বা ভুল ডেটা হতে পারে।

রেটিং সঠিকভাবে যোগ করা হয়েছে তা নিশ্চিত করার জন্য, আমরা একটি রেস্তোরাঁয় রেটিং যোগ করতে একটি লেনদেন ব্যবহার করব। এই লেনদেন কয়েকটি ক্রিয়া সম্পাদন করবে:

  • রেস্তোরাঁর বর্তমান রেটিং পড়ুন এবং নতুনটি গণনা করুন
  • সাবকলেকশনে রেটিং যোগ করুন
  • রেস্তোরাঁর গড় রেটিং এবং রেটিং সংখ্যা আপডেট করুন

ওপেন RestaurantDetailActivity.java এবং বাস্তবায়ন addRating ফাংশন:

    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() ফাংশন একটি ফেরৎ Task সমগ্র লেনদেন উপস্থাপন করে। ইন onRating() ফাংশন শ্রোতাকে কাজের সাড়া লেনদেনের ফলাফলের যোগ করা হয়।

এখন আবার অ্যাপ্লিকেশান চালু করুন এবং রেস্টুরেন্ট, যা রেস্টুরেন্টে বিস্তারিত পর্দা আসা উচিত হবে না। একটি পর্যালোচনা জোড়া শুরু করতে + বোতামে ক্লিক করুন। বেশ কয়েকটি তারকা বাছাই করে এবং কিছু পাঠ্য লিখে একটি পর্যালোচনা যোগ করুন।

78fa16cdf8ef435a.png

লেনদেন বন্ধ পদাঘাত হবে জমা দিন আঘাত। যখন লেনদেন সম্পন্ন হয়, আপনি নীচে আপনার পর্যালোচনা দেখবেন এবং রেস্টুরেন্টের পর্যালোচনা গণনার একটি আপডেট দেখতে পাবেন:

f9e670f40bd615b0.png

অভিনন্দন! আপনার এখন ক্লাউড ফায়ারস্টোরে নির্মিত একটি সামাজিক, স্থানীয়, মোবাইল রেস্টুরেন্ট পর্যালোচনা অ্যাপ আছে। আমি শুনেছি সেগুলি আজকাল খুব জনপ্রিয়।

এখন পর্যন্ত আমরা এই অ্যাপ্লিকেশনের নিরাপত্তা বিবেচনা করি নি। আমরা কিভাবে জানি যে ব্যবহারকারীরা শুধুমাত্র সঠিক ডেটা পড়তে এবং লিখতে পারে? Firestore datbases একটি কনফিগারেশন নামক ফাইল দ্বারা সুরক্ষিত নিরাপত্তা বিধি

খুলুন firestore.rules ফাইল, আপনি নিম্নলিখিত দেখতে হবে:

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;
    }
  }
}

আসুন এই নিয়ম পরিবর্তন, acesss বা পরিবর্তন অবাঞ্ছিত ডেটা প্রতিরোধ খুলতে firestore.rules ফাইল এবং নিম্নলিখিত বিষয়বস্তু প্রতিস্থাপন করুন:

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;
      }
    }
  }
}

ক্লায়েন্টরা শুধুমাত্র নিরাপদ পরিবর্তন করে তা নিশ্চিত করতে এই নিয়মগুলি অ্যাক্সেসকে সীমাবদ্ধ করে। উদাহরণস্বরূপ একটি রেস্তোরাঁ নথির আপডেট শুধুমাত্র রেটিং পরিবর্তন করতে পারে, নাম বা অন্য কোন অপরিবর্তনীয় তথ্য নয়। ব্যবহারকারী আইডি সাইন-ইন করা ব্যবহারকারীর সাথে মিলে গেলেই রেটিং তৈরি করা যায়, যা স্পুফিং প্রতিরোধ করে।

সিকিউরিটি রুলস সম্বন্ধে আরও পড়তে, এখানে যান ডকুমেন্টেশন

আপনি এখন Firestore এর উপরে একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত অ্যাপ তৈরি করেছেন। আপনি সবচেয়ে গুরুত্বপূর্ণ ফায়ারস্টোর বৈশিষ্ট্যগুলি সহ শিখেছেন:

  • দলিল এবং সংগ্রহ
  • ডেটা পড়া এবং লেখা
  • বাছাই এবং প্রশ্নের সাথে ফিল্টারিং
  • উপ -সংগ্রহ
  • লেনদেন

আরো জানুন

ফায়ারস্টোর সম্পর্কে শেখার জন্য, এখানে শুরু করার জন্য কিছু ভাল জায়গা রয়েছে:

এই কোডল্যাবের রেস্তোরাঁ অ্যাপটি "বন্ধুত্বপূর্ণ আহার" উদাহরণ অ্যাপ্লিকেশনের উপর ভিত্তি করে ছিল। আপনি যে অ্যাপ্লিকেশন জন্য সোর্স কোড ব্রাউজ করতে পারবেন এখানে

চ্ছিক: উত্পাদন কাজে লাগান

এখন পর্যন্ত এই অ্যাপটি শুধুমাত্র ফায়ারবেস এমুলেটর স্যুট ব্যবহার করেছে। আপনি যদি এই অ্যাপটিকে একটি বাস্তব ফায়ারবেস প্রকল্পে স্থাপন করতে শিখতে চান, তাহলে পরবর্তী ধাপে এগিয়ে যান।

এখন পর্যন্ত এই অ্যাপটি সম্পূর্ণ স্থানীয় হয়েছে, সমস্ত ডেটা ফায়ারবেস এমুলেটর স্যুটে রয়েছে। এই বিভাগে আপনি শিখবেন কিভাবে আপনার ফায়ারবেস প্রজেক্ট কনফিগার করতে হয় যাতে এই অ্যাপটি উৎপাদনে কাজ করে।

ফায়ারবেস প্রমাণীকরণ

Firebase ইন প্রমাণীকরণ অধ্যায় এবং তা নেভিগেট করা যেতে consle সাইন-ইন প্রোভাইডার ট্যাব

ইমেল সাইন-ইন পদ্ধতি সক্ষম করুন:

334ef7f6ff4da4ce.png

ফায়ারস্টোর

ডাটাবেস তৈরি করুন

কনসোলের Firestore বিভাগে এবং তা নেভিগেট ক্লিক ডাটাবেস তৈরি করুন:

  1. যখন প্রণোদিত সম্পর্কে সিকিউরিটি রুলস লক মোডে শুরু করার জন্য নির্বাচন, আমরা যারা নিয়ম শীঘ্রই আপডেট করব।
  2. আপনি আপনার অ্যাপের জন্য যে ডাটাবেস ব্যবহার করতে চান সেটি বেছে নিন। মনে রাখবেন যে, নির্বাচন একটি ডাটাবেস অবস্থান স্থায়ী সিদ্ধান্ত হয় এবং এটি পরিবর্তন করতে আপনি একটি নতুন প্রকল্প তৈরি করতে হবে। একটি প্রকল্প অবস্থান নির্বাচন আরো তথ্যের জন্য, দেখুন ডকুমেন্টেশন

নিয়ম প্রয়োগ করুন

আপনার আগে লেখা নিরাপত্তা বিধিগুলি স্থাপন করতে, কোডল্যাব ডিরেক্টরিতে নিম্নলিখিত কমান্ডটি চালান:

$ firebase deploy --only firestore:rules

এই বিষয়বস্তু মোতায়েন করবে firestore.rules আপনার প্রকল্পের, যা আপনি কনসোলে বিধি ট্যাবে নেভিগেট করে নিশ্চিত করতে পারেন হবে।

সূচকগুলি স্থাপন করুন

ফ্রেন্ডলিইটস অ্যাপটিতে জটিল বাছাই এবং ফিল্টারিং রয়েছে যার জন্য বেশ কয়েকটি কাস্টম যৌগিক সূচী প্রয়োজন। এই Firebase কনসোলে হাতে তৈরি করা যেতে পারে কিন্তু এটা সহজ হয় তাদের সংজ্ঞা লিখতে firestore.indexes.json ফাইল এবং Firebase CLI ব্যবহার করে সেগুলি স্থাপন।

আপনি খুলতে পারেন firestore.indexes.json আপনি যে ফাইলটি দেখতে হবে যে প্রয়োজনীয় ইনডেক্স ইতিমধ্যে প্রদান করা হয়েছে:

{
  "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": []
}

এই সূচীগুলি স্থাপন করতে নিম্নলিখিত কমান্ডটি চালান:

$ firebase deploy --only firestore:indexes

লক্ষ্য করুন যে সূচী তৈরি তাত্ক্ষণিক নয়, আপনি ফায়ারবেস কনসোলের অগ্রগতি পর্যবেক্ষণ করতে পারেন।

অ্যাপ কনফিগার করুন

ইন FirebaseUtil বর্গ আমরা যখন ডিবাগ মোডে emulators সাথে সংযোগ স্থাপনের জন্য Firebase SDK এর কনফিগার:

public class FirebaseUtil {

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

    // ...
}

আপনি যদি আপনার আসল ফায়ারবেস প্রকল্পের মাধ্যমে আপনার অ্যাপটি পরীক্ষা করতে চান তাহলে আপনি:

  1. অ্যাপটি রিলিজ মোডে তৈরি করুন এবং এটি একটি ডিভাইসে চালান।
  2. সাময়িকভাবে পরিবর্তন sUseEmulators করার false এবং আবার অ্যাপ্লিকেশন চালানো।

নোট আপনি অ্যাপ থেকে সাইন আউট এবং সঠিকভাবে উৎপাদন সাথে সংযোগ করার জন্য আবার সাইন ইন করতে হবে পারে।