التعامل مع قاعدة بيانات الـFirebase من الـUnity
شرح اهم اوامر الارسال والاسترجاع من قاعدة بيانات الفايربيس من خلال يونيتي
صباح/مساء الخير للجميع..
بمشيئة الله هذا المقال راح يشرح اهم الأوامر الي نحتاجها عشان نحفظ ونسترجع البيانات من قاعدة البيانات على الفايربيس، ان شاء الله اتوفق بإيصال الفكرة بشكل سهل وبسيط..
احب اذكر ان كل المعلومات الي راح اذكرها موضحة من قبل الفايربيس
https://firebase.google.com/docs/database/unity/start
وتقدروا اذا حابين تفاصيل اكثر تروحوا للريفرينس
https://firebase.google.com/docs/reference/unity/namespace/firebase/database
وراح احط لكم الروابط بعد كل نقطة يتم شرحها بإذن الله، يلا نبدأ..
قبل نبدأ نِعرف كيف نرسل ونسترجع البيانات للفايربيس لازم نعرف ان قاعدة البيانات مهي مثل ما تعودنا عليها مع SQL، فلا تتوقعوا انه يكون عندنا جداول تحتوي على أعمدة وصفوف، الفايربيس مختلفة عن كذا تماما فهي تتعامل مع علاقة اشبه بالنظام الهرمي او علاقة الـ parent-child، وهذا يعني انه راح يكون عندنا جذر Root أساسي يتفرع منه ابناء Children وكل ابن له عدة تفرعات أخرى الى ان نصل لأخر التفرع، اخر شايلد بالسلسلة يسمى Key ولازم يكون ماخذ قيمة Value.
مثال على كذا لو عندنا مستخدمين وكل مستخدم له معلوماته الخاصة فراح نمثل البيانات بهذي الطريقة
الاسم بأول الصورة setupfirebase-a8f71 هو الروت بالنسبة للداتابيس وهو ينشأ من قبل الفايربيس ما بإمكاننا تغييره وبيتفرع منه شايلد اسمه usres يحتوي المستخدمين، نلاحظ التفرعات الأخيرة مثل city و nameهذي عبارة عن Key والقيمة الي شايلتها مثل Sara, Riyadh هذي تعبر Value.
لو حابين نضيف معلومات ثانية غير الـUsers مثلا منتجات Products فممكن نضيف شايلد جديد على الروت بنفس مستوى الـUsers
*ملاحظة نحطها بعين الاعتبار: القيمة الي تاخذها الـKey قد تكون نص string وقد تكون رقم integer، مثلا نلاحظ الشايلد id هو هنا يعتبر string لو استرجعناه وتعاملنا معاه بالكود على انه رقم بيعطينا ايرور لانه مخزن بتايب مختلف، فكمان لا ننسى وقت نكتب القيم يدويا من خلال موقع الفايربيس اننا ننتبه اذا نبغاه string نحط علامة التنصيص “”.
هذا الرابط المرجعي اذا حابين تقرأو اكثر عن بنية قاعدة البيانات
https://firebase.google.com/docs/database/unity/structure-data
طيب بما اننا فهمنا طريقة تخزين الفايربيس احنا الان حابين نرسل بيانات من تطبيقنا على الـDatabase, بالأول لازم نربط اليونيتي عندنا بالفايربيس وانا سبق وضحت الربط بمقال اخر تقدروا توصلونه من خلال هذا الرابط
https://3alam.pro/asalalghamdi/articles/setup-firebase-with-unity
إذا كنا مثبتين الفايربيس داتابيس مع اليونيتي فالان نفتح سكربت C# جديد ونبدأ نكتب codeing..
*ملاحظة: بأسفل المقال راح تلاقوا رابط قيت هب لملف C# بيحتوي كل الاوامر الي راح اوضحها، إذا حابين تنسخوا الاكواد لتجربوها انزلوا للينك..
طيب الان نحتاج نوصل لقاعدة البيانات بمشروع الفايربيس عندنا عشان نرسلها البيانات، فراح نعرِّف الرابط الخاص بقاعدة البيانات داخل الاكواد، من هنا تقدروا تلقوا الرابط للداتابيس الخاصة بمشروعكم..
بعد كذا نروح للسكربت ونكتب هذا السطر ونلصق الرابط فيه..
طبعا لا ننسى اننا نغير الصلاحية لقاعدة البيانات ونخليها تسمح لنا بالتخزين والاسترجاع
بعد ما اكوادنا صار بإمكانها توصل لقاعدة البيانات الان نحتاج نحدد أي باث او أي شايلد راح نضيف عليه البيانات، إذا حابين نضيف شايلد جديد على الروت الأساسي فراح نعرِّف متغير مثلا نسميه reference يدل على الروت
ونضيف على هذا المتغير البيانات وقيمتها. عشان نضيف شايلد جديد نستخدم ميثود Child() والقيمة الي حابين نضيفها للشايلد نستخدم ميثود SetValueAsync()
ميثود Child() مهي مخصصة بإنها تضيف شايلد جديد لكن اذا استخدمناها عشان نرسل داتا راح تنشئ، وعموما هيا غالبا تستخدم لتحديد باث معين بقاعدة البيانات.
لو نفذنا الكود راح تتخزن القيم بهذي الطريقة
setupfirebase-a8f71 مثل ما ذكرنا هو اسم الروت عندي فمتغير reference بالكود يشير عليه.
ميثود SetValueAsync() ترسلنا كل قيمة على حدى، لكن ممكن نستخدم ميثود SetRawJsonValueAsync() لترسلنا قيم كثيرة بتنسيق JSON مرة وحدة. بمعنى لو عندي معلومات كثيرة غير name, city فممكن احطهم بتنسيق Json وارسلهم..
بالمثال استخدمنا اوبجكت حولنا بياناته الى تنسيق JSON واعطيناه للميثود SetRawJsonValueAsync().
وترى فينا نعطي الميثود نص string من تنسيق json بدون نستعمل اوبجكت فممكن نكتب بهذي الطريقة:
string json = “{\”name\”:\”Asal Alghamdi\”,\”city\”:\”Jeddah\”}”;
*معلومة: تنسيق JSON هي طريقة متبعة لترتيب البيانات ليسهل تبادلها
https://www.w3schools.com/whatis/whatis_json.asp
*ملاحظة مهمة جدا: ميثود SetValueAsync() راح تضيف على الشايلد بدون ما تمسح أي children منه بعكس ميثود SetRawJsonValueAsync() فهي راح تمسح أي شايلد خارج من الشايلد الي بنضيف عليه وراح تعين البيانات الجديدة.
اذا حابين نعمل اسم عشوائي مميز للشايلد بدون ما اننا نعينه ويسهِّل علينا، راح نستخدم ميثود Puch().
لاحظوا بالصورة اسفل لما استخدمنا Push() تلقائيا اعطانا اسم عشوائي يحتوي حروف وأرقام وعلامات.
اذا حابين نحذف القيمة من قاعدة البيانات فممكن نستخدم ميثود RemoveValueAsync()
او ممكن نستخدم نفس ميثود SetValueAsync() ولكن نعطيها قيمة Null، هذا راح يأدي الى حذف الشايلد.
هذي تقريبا اهم الميثودات المستخدمة لتخزين الداتا، اطلعوا على الدوكيومنت لتفاصيل اكثر اذا حابين.
https://firebase.google.com/docs/database/unity/save-data
الان راح نجي لاسترجاع البيانات.. خذوا بريك 🤓
الإسترجاع مو صعب لكن للأسف بموقع فايربيس مو كثير واضح واخذ مني وقت لأفهم عليهم، لكن ما يهمكم ان شاء الله بيكون واضح لكم. ✌🏻
طيب مثل الارسال فوق احنا كنا محتاجين Reference او تحديد باث لشايلد عشان ناخذ منه البيانات، بعد كذا راح نستخدم ميثود GetValueAsync() ونلحقها بـ ContinueWith ونفتح اقواس داخلها تاسك task.
تاسك ما تشيلوا همها، تقريبا هذي الاكواد مثل الروتينية كل مرة تبوا استرجاع افتحوا تاسك، اهم شي عندنا هو المتغير snapshot من نوع DataSnapshot بالكود، هذا المتغير هو الي شايل لنا كل الداتا الي يحتويها الشايلد.
إذا احنا محددين كامل الباث الي يوصلنا للقيمة فممكن نستعمل ميثود value مع السنابشوت وراح يرجع لنا القيمة المحددة
الكود راح يطبع لنا الاسم للمستخدم الأول بحسب الباث الي حددناه
*معلومة: ToString() ميثود تحول الداتا تايب الي string. مرات كثيرة راح تحتاجوا تستخدموها لان غالبا الميثودات ترجع نوع اوبجكت فنحتاج نغير التايب.
اذا كنا محددين شايلد يحتوي على children ومو قيمة وحدة فممكن نستخدم ميثود GetRawJsonValue() راح ترجع لنا كامل البيانات بصيغة JSON.
نلاحظ الباث حددناه فقط على usres.
*معلومة: اذا استعملنا ميثود Value بالسنابشوت وكان للشايلد children مو قيمة وحدة فالسنابشوت راح يرجع لنا اوبجكت من نوع IDictionary
*IDictionary : هي List من قيمتين Key و Value
ممكن نستعمل ميثود Child() مع الـsnapshot راح توصلنا للشايلد الي اسفل الباث الي استرجعناه، مثال انا عملت استرجاع لمعلومات اليوزر الأول وحبيت اخذ الاسم فقط عن طريق الـKey فممكن اكتب الكود بالشكل هذا
اذا كان عندنا الـsnapshot يحتوي عدد من الشيلدرن وممكن ما نكون عارفين الـKey لهم ففي عندنا ميثود Children راح نقدر من خلالها نوصل لكل شايلد بدون كتابة اسمه بالتحديد، سواء كان يحتوي قيمة ممكن نطبعها او ممكن يحتوي على Children اكثر ممكن نوصلهم.
بنفس مثالنا فوق حق اليوزر الأول لو حابين نستعمل ميثود Children ونطبع كل معلوماته name, city فراح نكتب الكود بهذي الطريقة..
اللوب foreach راح يمشي على كل شايلد داخل السنابشوت. (يعني راح يمشي بالأول على city وبعدين name)
ميثود Key بترجع لنا اسم الشايلد اوالـkey الي الـDataSnapshot واقفة عليه.
هنا نتيجة طباعة اللوب..
اخر ميثود بوضحها هيا ميثود ChildrenCount وهذي راح ترجع لنا رقم بعدد الشيلدرن داخل السنابشوت من نوع long..
اذا كان الشايلد عبارة عن Key يحتوي قيمة فراح ينطبع لنا صفر بمعنى لا يوجد أي شايلد بالسنابشوت.
هذي كانت اخر اهم ميثود بموضوع الاسترجاع وهذا رابط مرجعي اذا حابين تستزيدوا اكثر
https://firebase.google.com/docs/reference/unity/class/firebase/database/data-snapshot
وبالاخير وللتسهيل انا نزلت سكربت C# باللينك كتبت فيه كل الميثودات الي ذكرتها بالمقال، الملف جهزته بحيث يكون شامل الاكواد ويسهل تجربته بمجرد ارفاقه لليونيتي..
https://github.com/AsalAlghamdi/firebase-databse-methods/blob/master/FirebaseScript.cs
أي أسئلة او شغلة ما ضبطت معكم اسألوني بالتعليقات او تواصلوا معي على حسابي بتويتر @asalgham
انا جدا مرحبة لأي ملاحظات تشوفونها مناسبة لتحسين المقال.
شكرا للقراءة اتمنى كانت لطيفة وبالتوفيق للجميع..
^على فكرة هذي البطاريق تعبر عن مشاعري لإنهائي كتابة المقال P:
التعليقات (1)
ظهرت لي مشكلة في المكتبة using Firebase.Unity.Editor و FirebaseApp
ومشكووووووووووووووووووووور تابع
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !