Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Android SDK
Code

إنشاء تطبيق تعقب الوزن مع Cloud Firestore

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by Adjatay Bashroh Aldad (you can also view the original English article)

يعد تخزين بيانات تطبيقك في السحاب أمرًا مهمًا جدًا في هذه الأيام نظرًا لأن المستخدمين يميلون إلى امتلاك أجهزة متعددة ويرغبون في مزامنة تطبيقاتهم عبر جميع هذه الأجهزة. مع Cloud Firestore ، وهي قاعدة بيانات NoSQL في الوقت الفعلي متوفرة على منصة Firebase ، فإن القيام بذلك أسهل وأكثر أمانًا من أي وقت مضى.

في برنامج تعليمي سابق ، تعرفت على جميع الميزات القوية التي تقدمها Cloud Firestore. اليوم ، سأوضح لك كيفية استخدامها جنبًا إلى جنب مع منتجات Firebase الأخرى ، مثل FirebaseUI Auth و Firebase Analytics ، لإنشاء تطبيق تعقب للوزن بسيط ، ولكن قابل للتطوير بشكل كبير.

المتطلبات الأساسية

لمتابعة هذا البرنامج التعليمي خطوة بخطوة ، ستحتاج إلى:

  • أحدث إصدار من Android Studio
  • حساب Firebase
  • وجهاز أو محاكي يعمل بنظام التشغيل Android 5.0 أو إصدار أحدث

1. إعداد المشروع

حتى تتمكن من استخدام منتجات Firebase في مشروع Android Studio ، ستحتاج إلى المكوّن الإضافي لـ Google Services Gradle ، وملف تكوين Firebase ، وبعض تبعيات التنفيذ. باستخدام مساعد Firebase ، يمكنك الحصول عليها بكل سهولة.

افتح المساعد بالانتقال إلى أدوات> Firebase. بعد ذلك ، حدد خيار Analytics وانقر على رابط سجل حدث Analytics.

Fierbase Assistant panel

يمكنك الآن الضغط على زر الاتصال بـ Firebase لربط مشروع Android Studio بمشروع Firebase جديد.

Connect to Firebase dialog

ومع ذلك ، لإضافة المكون الإضافي والإضافات المتعلقة بالتنفيذ ، ستحتاج أيضًا إلى الضغط على الزر إضافة تحليلات إلى تطبيقك.

سيكون تطبيق تعقب الوزن الذي نقوم بإنشائه اليوم عبارة عن ميزتين فقط: تخزين الأوزان وعرضها كقائمة مرتبة ترتيبًا زمنيًا عكسيًا. بالطبع سنستخدم Firestore لتخزين الأوزان. ولكن لعرضها كقائمة ، سنستخدم المكونات المتعلقة بـ Firestore المتوفرة في مكتبة FirebaseUI. لذلك ، قم بإضافة تبعية التطبيق التالية إلى ملف build.gradle الخاص بوحدة التطبيق:

يجب أن يكون المستخدمون قادرين على عرض أوزانهم فقط ، وليس على أوزان كل شخص يستخدم التطبيق. لذلك ، يحتاج تطبيقنا إلى القدرة على تحديد مستخدميه بشكل فريد. يوفر FirebaseUI Auth هذه الإمكانية ، لذا أضف التبعية التالية بعد ذلك:

سنكون أيضًا بحاجة إلى بعض أدوات تصميم المواد لإضفاء مظهر جذاب على تطبيقنا. لذلك تأكد من إضافة مكتبة Design Support ومكتبة Material Dialogs على أنها تبعيات.

وأخيرًا ، اضغط على الزر مزامنة الآن لتحديث المشروع.

2. تكوين مصادقة Firebase

تدعم مصادقة Firebase مجموعة متنوعة من مقدمي الهوية. ومع ذلك ، يتم تعطيل كل منهم بشكل افتراضي. لتمكين واحد أو أكثر منها ، يجب عليك زيارة وحدة تحكم Firebase.

في وحدة التحكم ، حدد مشروع Firebase الذي أنشأته في الخطوة السابقة ، وانتقل إلى قسم المصادقة الخاص به ، واضغط على زر إعداد طريقة تسجيل الدخول.

Firebase Authentication home screen

للسماح للمستخدمين بتسجيل الدخول إلى تطبيقنا باستخدام حساب Google ، قم بتمكين Google كمزود ، وامنح اسمًا عامًا ذا معنى للجمهور للمشروع ، واضغط على زر حفظ.

Google identity provider configuration

إن Google هي أسهل مزود للهوية يمكنك استخدامه. لا يحتاج إلى أي تهيئة ، ولن يحتاج مشروع Android Studio إلى أي تبعيات إضافية له.

3. تكوين Cloud Firestore

يجب تمكين Firestore في وحدة تحكم Firebase قبل بدء استخدامه. للقيام بذلك ، انتقل إلى قسم قاعدة البيانات واضغط على زر 'البدء' الموجود في بطاقة Cloud Firestore Beta.

Cloud Firestore card

سيتم الآن مطالبتك بتحديد وضع أمان لقاعدة البيانات. تأكد من اختيار الخيار Start in locked mode واضغط على زر Enable (تمكين).

Security mode selection screen

في الوضع المقفل ، بشكل افتراضي ، لن يتمكن أي شخص من الوصول إلى محتويات قاعدة البيانات أو تعديلها. لذلك ، يجب عليك الآن إنشاء قاعدة أمان تسمح للمستخدمين بقراءة تلك الوثائق التي تخصهم وكتابتها فقط. ابدأ بفتح علامة التبويب القواعد.

قبل إنشاء قاعدة أمان لقاعدة البيانات الخاصة بنا ، يجب أن ننتهي من الطريقة التي سنقوم بتخزين البيانات بها. لنفترض أننا سنحصل على مجموعة عالية المستوى تسمى مستخدمين يتضمنون مستندات تمثل مستخدمينا. يمكن أن تحتوي المستندات على معرفات فريدة مماثلة للمعرفات التي تنشئها خدمة مصادقة Firebase للمستخدمين.

نظرًا لأن المستخدمين سيضيفون عدة إدخالات للوزن إلى مستنداتهم ، فإن استخدام مجموعة فرعية لتخزين تلك الإدخالات يعتبر أمرًا مثاليًا. دعونا نطلق على أوزان المجموعة الفرعية.

Firestore database structure

استنادًا إلى المخطط أعلاه ، يمكننا الآن إنشاء قاعدة لمستخدمي المسار / {user_id} / أوزان / {وزن}. ستكون القاعدة أنه يُسمح للمستخدم بالقراءة من والكتابة إلى المسار فقط إذا كان المتغير {user_id} مساويًا لمعرف مصادقة Firebase للمستخدم.

وفقا لذلك ، قم بتحديث محتويات محرر القواعد.

وأخيرًا ، اضغط على الزر نشر لتنشيط القاعدة.

4. توثيق المستخدمين

يجب أن يكون تطبيقنا قابلاً للاستخدام فقط إذا تم تسجيل دخول المستخدم إليه باستخدام حساب Google. لذلك ، بمجرد فتحه ، يجب عليه التحقق مما إذا كان المستخدم لديه معرف مصادقة صالح لـ Firebase. إذا كان لدى المستخدم الرقم التعريفي ، فيجب أن يتم تقديم واجهة المستخدم. بخلاف ذلك ، يجب أن تعرض شاشة تسجيل الدخول.

للتحقق مما إذا كان المستخدم لديه معرف ، يمكننا ببساطة التحقق من أن الخاصية الحالية للمستخدم لفئة FirebaseAuth ليست خالية. إذا كانت فارغة ، يمكننا إنشاء هدف تسجيل الدخول عن طريق استدعاء الأسلوب createSignInIntentBuilder () لفئة AuthUI.

يعرض لك التعليمة البرمجية التالية كيفية القيام بذلك لـ Google كموفر الهوية:

لاحظ أننا نسمي طريقة باسم showUI () إذا كان معرف صالح موجود بالفعل. هذه الطريقة غير موجودة حتى الآن ، لذا قم بإنشائها واترك جسمها فارغًا في الوقت الحالي.

للقبض على نتيجة هدف تسجيل الدخول ، يجب تجاوز طريقة onActivityResult () للنشاط. داخل الطريقة ، إذا كانت قيمة الوسيطة resultCode هي RESULT_OK ولم تعد الخاصية currentUser فارغة ، فهذا يعني أن المستخدم تمكن من تسجيل الدخول بنجاح. في هذه الحالة ، يجب علينا مرة أخرى استدعاء الأسلوب showUI () لتقديم واجهة المستخدم.

إذا فشل المستخدم في تسجيل الدخول ، فيمكننا عرض نخب وإغلاق التطبيق عن طريق استدعاء طريقة الإنهاء ().

وفقا لذلك ، قم بإضافة التعليمة البرمجية التالية إلى النشاط:

في هذه المرحلة ، إذا شغّلت التطبيق لأول مرة ، فستتمكن من رؤية شاشة تسجيل الدخول التي تبدو كالتالي:

Account selection dialog

عند التشغيل لاحقًا — بفضل Google Smart Lock ، الذي يتم تمكينه افتراضيًا — سيتم تسجيل الدخول تلقائيًا.

5. تحديد التنسيقات

يحتاج تطبيقنا إلى تخطيطين: أحدهما للنشاط الرئيسي والآخر لإدخالات الوزن التي سيتم عرضها كعناصر من القائمة المنسوبة ترتيبًا زمنيًا.

يجب أن يحتوي تخطيط النشاط الرئيسي على عنصر واجهة مستخدم RecyclerView ، والذي سيعمل كقائمة ، وعنصر واجهة مستخدم FloatingActionButton ، والذي يمكن للمستخدم الضغط عليه لإنشاء إدخال وزن جديد. بعد وضعهما داخل عنصر واجهة مستخدم RelativeLayout ، يجب أن يبدو ملف XML الخاص بتنسيق نشاطك كما يلي:

لقد ارتبطنا معالج حدث على انقر المسمى addWeight () مع القطعة FloatingActionButton. المعالج غير موجود حتى الآن ، لذلك أنشئ كعبًا لها داخل النشاط.

للحفاظ على تخطيط إدخال الوزن بسيطًا ، سيكون لدينا وحدتين TextView ضمنه: أحدهما لعرض الوزن والآخر لعرض الوقت الذي تم فيه إنشاء الإدخال. سوف يكفي استخدام أداة LinearLayout كحاوية لهم.

وبناءً عليه ، قم بإنشاء ملف XML تخطيطي جديد باسم weight_entry.xml وأضف الكود التالي إليه:

6. إنشاء نموذج

في الخطوة السابقة ، لاحظت أن لكل إدخال للوزن وزن ووقت مرتبطين به. للسماح لفيريستور بمعرفة ذلك ، يجب علينا إنشاء نموذج لدخول الوزن.

عادة ما تكون نماذج Firestore عبارة عن فئات بيانات بسيطة ذات متغيرات العضو المطلوبة.

الآن هو الوقت المناسب أيضًا لإنشاء حامل عرض لكل إدخال للوزن. سيتم استخدام مالك العرض ، كما كنت قد خمنت ، بواسطة أداة RecyclerView لعرض عناصر القائمة. لذلك قم بإنشاء فئة جديدة باسم WeightEntryVH ، والتي تمتد الفئة RecyclerView.ViewHolder ، وإنشاء المتغيرات الخاصة بالأعضاء لكل من TextView الحاجيات. لا تنس أن تهيئتها باستخدام طريقة findViewById (). يوضح لك التعليمة البرمجية التالية كيفية القيام بإيجاز:

7. إنشاء مستندات المستخدم الفريدة

عندما يحاول المستخدم إنشاء إدخال للوزن لأول مرة ، يجب أن يقوم تطبيقنا بإنشاء مستند منفصل للمستخدم داخل مجموعة المستخدمين على Firestore. كما قررنا سابقًا ، لن يكون معرف المستند سوى معرف مصادقة Firebase للمستخدم ، والذي يمكن الحصول عليه باستخدام خاصية uid للكائن الحالي للمستخدم.

للحصول على مرجع إلى مجموعة المستخدمين ، يجب أن نستخدم طريقة مجموعة () للفئة FirebaseFirestore. يمكننا بعد ذلك استدعاء طريقة المستند () وتمرير uid كوسيطة لإنشاء وثيقة المستخدم.

سنحتاج إلى الوصول إلى المستندات الخاصة بالمستخدم أثناء قراءة وإدخال قيود الوزن. لتجنب ترميز المنطق أعلاه مرتين ، أقترح عليك إنشاء طريقة منفصلة لذلك.

لاحظ أنه سيتم إنشاء المستند مرة واحدة فقط لكل مستخدم. بمعنى آخر ، ستؤدي المكالمات المتعددة إلى الأسلوب السابق دائمًا إلى إرجاع المستند نفسه ، طالما أن المستخدم يستخدم نفس حساب Google.

8. إضافة الوزن المدخلات

عندما يضغط المستخدمون على زر الإجراء العائم في تطبيقنا ، يجب أن يكونوا قادرين على إنشاء إدخالات جديدة للوزن. للسماح لهم بكتابة أوزانهم ، دعونا الآن إنشاء مربع حوار يحتوي على عنصر واجهة تعامل المستخدم. باستخدام مكتبة حوارات المواد ، يعد القيام بذلك أمرًا بديهيًا للغاية.

داخل الأسلوب addWeight () ، الذي يعمل كمعالج حدث عند النقر على الزر ، قم بإنشاء مثيل MaterialDialog.Builder واستدعاء طرق العنوان () والمحتوى () لمنح مربع الحوار عنوانًا ورسالة ذات معنى. وبالمثل ، قم باستدعاء طريقة inputType () وتمرير TYPE_CLASS_NUMBER كوسيطة لها للتأكد من أن المستخدم يمكنه كتابة الأرقام فقط في مربع الحوار.

بعد ذلك ، استدعاء الأسلوب input () لتحديد تلميح وإقران معالج أحداث مع مربع الحوار. سيحصل المعالج على الوزن الذي كتبه المستخدم كوسيطة.

وأخيرًا ، تأكد من استدعاء الأسلوب show () لعرض مربع الحوار.

داخل معالج الأحداث ، يجب علينا الآن إضافة رمز لإنشاء ونشر مستند إدخال الوزن الجديد. نظرًا لأن المستند يجب أن ينتمي إلى مجموعة الأوزان الخاصة بمستند المستخدم الفريد من أجل الوصول إلى المجموعة ، يجب استدعاء طريقة المجموعة () للمستند الذي يتم إرجاعه بواسطة أسلوب getUserDocument ().

بمجرد الحصول على المجموعة ، يمكنك استدعاء طريقة add () الخاصة بها وتمرير مثيل جديد من فئة WeightEntry إليه لتخزين الإدخال.

في التعليمة البرمجية المذكورة أعلاه ، يمكنك أن ترى أننا نستخدم خاصية الوقت لفئة التاريخ لربط طابع زمني مع الإدخال.

إذا قمت بتشغيل التطبيق الآن ، فيجب أن تتمكن من إضافة مدخلات جديدة للوزن إلى Firestore. لن تراها في التطبيق بعد ، ولكنها ستكون مرئية في وحدة تحكم Firebase.

Add weight dialog

9. عرض إدخالات الوزن

لقد حان الوقت الآن لتجميع عنصر RecyclerView في تخطيطنا. لذا ابدأ بإنشاء مرجع له باستخدام أسلوب findViewById () وتعيين مثيل جديد من فئة LinearLayoutManager إليه. يجب أن يتم ذلك داخل أسلوب showUI () الذي أنشأناه سابقًا.

يجب أن تعرض الأداة RecyclerView كافة المستندات الموجودة داخل مجموعة الأوزان الخاصة بمستند المستخدم. علاوة على ذلك ، يجب أن تظهر المستندات الأخيرة أولاً. لتلبية هذه المتطلبات ، يجب علينا الآن إنشاء استعلام عن طريق استدعاء أساليب جمع () و orderBy ().

من أجل الكفاءة ، يمكنك تحديد عدد القيم التي يتم إرجاعها بواسطة الاستعلام عن طريق استدعاء الحد ().

تعمل التعليمة البرمجية التالية على إنشاء استعلام يعرض آخر إدخالات الوزن البالغ عددها 90 التي أنشأها المستخدم:

باستخدام الاستعلام ، يجب علينا الآن إنشاء كائن FirestoreRecyclerOptions ، والذي سنستخدمه لاحقًا لتكوين محول أداة RecyclerView. تأمين بيانات المسعند تمرير مثيل الاستعلام إلى الأسلوب setQuery () منشئه ، تأكد من تحديد أن النتائج التي تم إرجاعها تكون في شكل كائنات WeightEntry. يوضح لك التعليمة البرمجية التالية كيفية القيام بذلك:تخدم بكلمة مرور

ربما لاحظت أننا نقوم بنشاطنا الحالي لمالك دورة حياة الكائن FirestoreRecyclerOptions. يعد القيام بذلك أمرًا مهمًا لأننا نريد أن يستجيب المهايئ بشكل مناسب لأحداث دورة حياة مشتركة ، مثل قيام المستخدم بفتح التطبيق أو إغلاقه.

في هذه المرحلة ، يمكننا إنشاء كائن FirestoreRecyclerAdapter ، والذي يستخدم الكائن FirestoreRecyclerOptions لتكوين نفسه. نظرًا لأن فئة FirestoreRecyclerAdapter مستخلصة ، يجب أن يتجاوز Android Studio طرقه تلقائيًا لإنشاء شفرة تبدو كالتالي:

في هذه المرحلة ، يمكننا إنشاء كائن FirestoreRecyclerAdapter ، والذي يستخدم الكائن FirestoreRecyclerOptions لتكوين نفسه. نظرًا لأن فئة FirestoreRecyclerAdapter مستخلصة ، يجب أن يتجاوز Android Studio طرقه تلقائيًا لإنشاء شفرة تبدو كالتالي:

داخل أسلوب onCreateViewHolder () ، كل ما عليك القيام به هو تضخيم ملف تخطيط weight_entry.xml وإرجاع كائن حامل عرض WeightEntryVH استناداً إليها.

وداخل الأسلوب onBindViewHolder () ، يجب استخدام وسيطة النموذج لتحديث محتويات عناصر واجهة مستخدم TextView الموجودة داخل حامل العرض.

على الرغم من أن تحديث أداة weightView أمر بسيط ، إلا أن تحديث أداة timeView يكون معقدًا بعض الشيء ؛ لأننا لا نريد إظهار الطابع الزمني ، وهو بالمللي ثانية ، للمستخدم مباشرة.

إن أسهل طريقة لتحويل الطابع الزمني إلى تاريخ ووقت يمكن قراءته هي استخدام أسلوب formatDateTime () الخاص بفئة DateUtils. بالإضافة إلى الطابع الزمني ، يمكن للطريقة قبول العديد من الأعلام المختلفة ، والتي ستستخدمها في تنسيق التاريخ والوقت. أنت حر في استخدام الأعلام التي تطابق تفضيلاتك.

وأخيرًا ، لا تنس أن تشير القطعة RecyclerView إلى المحول الذي أنشأناه للتو.

التطبيق جاهز. يجب أن تكون الآن قادرًا على إضافة إدخالات جديدة ومشاهدتها تظهر في القائمة على الفور تقريبًا. إذا قمت بتشغيل التطبيق على جهاز آخر له نفس حساب Google ، فسترى نفس إدخالات الوزن تظهر عليه أيضًا.

Weight entries shown as a list

الاستنتاج

في هذا البرنامج التعليمي ، شاهدت مدى سرعة وسهولة إنشاء تطبيق تعقب وزن وظيفي بالكامل للأندرويد باستخدام Cloud Firestore كقاعدة بيانات. لا تتردد في إضافة المزيد من الوظائف لذلك! أقترح عليك أيضًا أن تجرب نشرها على Google Play. مع خطة Firebase Spark ، التي توفر حاليًا سعة تخزينية مجانية تبلغ 1 غيغابايت ، لن تواجهك مشكلات في خدمة بضعة آلاف من المستخدمين على الأقل.

وأثناء وجودك هنا ، يمكنك الاطلاع على بعض مشاركاتنا الأخرى حول تطوير تطبيق Android!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.