استفاده از Database در Firebase
در سری مقالات آموزس Firebase, در این مقاله به مبحث Database میپردازیم.
حتما برای شما پیش آمده است که نیاز داشته باشید تا یکسری اطلاعات با ساختار مشخص را در برنامه خود ذخیزه سازی کنید. میتوانید برای اینکار از فایل ها و یا Database استفاده کنید. استفاده از فایل ها به دلیل حجیم تر بودن و همینطور کند تر بودن ارتباط با آنها در قیاس با Database ها, باعث این میشود که از ذخیره سازی اطلاعات با فایل ها خودداری کنیم.
در اندروید روش های گوناگونی وجود دارد که میتوانید از آن استفاده کنید. بهتر است از Database هایی استفاده شود که بدون استفاده از دستورات SQL با اطلاعات تعامل میکنند.
از سوی دیگر گاهی نیاز است تا این اطلاعات از طریق چندین client مورد استفاده قرار گیرد. در صورتی که اطلاعات فقط بر روی دستگاه شخص ذخیره شده باشد, امکان استفاده از آن برای چندین کاربر وجود ندارد. در چنین مواردی نیاز است تا یک Database بر روی Server خود داشته باشید. در این صورت تمام client ها میتوانند از یکسری اطلاعات در یک محیط مشترک استفاده کنند.
در راستای موارد گفته شده میتوان به Firebase NoSql Could Database اشاره کرد. همانطور که از نام آن مشخص است تمام ویژگی هایی که در بالا گفته شده را در درون خود دارد. از مزایای استفاده از آن میتوان به نکات زیر اشاره کرد :
- Real time : با هر تغییر بر روی اطلاعات ذخیره شده, با استفاده از data synchronization, اطلاعات ذخیره شده بر روی دستگاه های متصل تغییر و بروز رسانی میشوند.
- Offline : در صورتی که دسترسی به server قطع شود, Firebase Realtime Database SDK اطلاعات را بر روی دستگاه نگهداری خواهد کرد. وقتی که مجددا به server متصل شود, اطلاعات خود را بروز رسانی میکند.
- قابلیت دسترسی : امکان دسترسی برای تمام دستگاه های متصل به Firebase ما وچود دارد. همچنین امنیت برنامه نیز با استفاده از Security Role ها تأمین میگردد.
پروژه ای که در ابتدای آموزش ساخته ایم را ادامه میدهیم و به build.gradle آن dependency را اضافه میکنیم
compile 'com.google.firebase:firebase-database:10.0.1'
میخواهیم یک دفترچه تلفن با استفاده از امکانات آن بسازیم.
ابتدا یک مدل برای آیتم ها تعریف میکنیم :
public class Contacts { private String name; private String mobile; private String phone; private int id; public Contacts() { } public Contacts(String name, String mobile, String phone, int id) { this.name = name; this.mobile = mobile; this.phone = phone; this.id = id; } }
یک constructor خالی حتما باید ایجاد کنید. چون مقداری که از سمت server بر میگردد برای اینکه در کلاس مروبطه قرار بگیرد به یک default constructor نیاز دارد.
یک متد ایجاد میکنیم و در آن فرآیند های مربوط به Database را مدیریت میکنیم. ابتدا لازم است تا یک instance ایجاد کنیم :
private void database() { FirebaseDatabase db = FirebaseDatabase.getInstance(); }
سپس به همان صورتی که در Storage استفاده کردیم نیاز به DatabaseReference ها داریم و ساختار ذخیره اطلاعات را مشخص میکنیم :
private void database() { FirebaseDatabase db = FirebaseDatabase.getInstance(); DatabaseReference contacts = db.getReference("contacts"); DatabaseReference id = contacts.child("id"); DatabaseReference name = id.child("name"); DatabaseReference phone = id.child("phone"); DatabaseReference mobile = id.child("mobile"); name.setValue("Vahid Rajabi"); phone.setValue("+98 11 322 00000"); mobile.setValue("+98 900 000 0000"); }
به این ترتیب اطلاعات ما ذخیره شده اند. همچنین توجه داشته باشید در صورتی که به server متصل نباشید مشکلی در ثبت اطلاعات برای شما رخ نخواهد داد و در اولین اتصال با server اطلاعات شما بر روی server قرار میگیرد.
همانطور که در امکانات Firebase Database اشاره شد در صورت تغییر و یا افزودن اطلاعاتی, آنرا در کوتاه ترین زمان برروی دستگاه کاربران متصل ارسال میکند. همین روش نیز برای فراخوانی اولیه اطلاعات و read استفاده میشود.
private void read() { FirebaseDatabase db = FirebaseDatabase.getInstance(); db.getReference().addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Contact contact = dataSnapshot.child("contacts").child("user1").getValue(Contact.class); System.out.println(contact.getName()); } @Override public void onCancelled(DatabaseError databaseError) { } }); }
در متد بالا در ابتدای شروع برنامه Contact را مقدار دهی میکند و با اعمال هر تغییری در طول برنامه, مقدار آن را بروز رسانی خواهد کرد.
در صورتی که بخواهید مقدار را بروز رسانی کنید, باید موقعت اطلاعاتی که میخواهید ویرایش کنید را مشخص کنید و سپس مقدار را قرار دهید. در این صورت مقدار جدید جایگزین مقدار قبلی خواهد شد.
private void update() { FirebaseDatabase db = FirebaseDatabase.getInstance(); DatabaseReference update = db.getReference(); DatabaseReference contacts = update.child("contacts"); DatabaseReference id = contacts.child("user1"); DatabaseReference name = id.child("name"); name.setValue("vhdrjb"); }
و همچنین برای حذف نیز میتوانید از این روش استفاده کنید
private void delete() { FirebaseDatabase db = FirebaseDatabase.getInstance(); DatabaseReference update = db.getReference(); DatabaseReference contacts = update.child("contacts"); DatabaseReference id = contacts.child("user1"); DatabaseReference mobile = id.child("mobile"); mobile.removeValue(); }
توجه داشته باشید که در این روش field مربوط به mobile حذف خواهد شد.
همچنین شما میتوانید به صورت تراکنشی اطلاعات خود را وارد کنید. مهم ترین اصل در تراکنش ها این است که اگر قسمتی از تراکنش اجرا نشد تمام آن تراکنش لغو گردد و به حالت پیش از تراکنش بازگردد.
private void transaction() { FirebaseDatabase db = FirebaseDatabase.getInstance(); DatabaseReference update = db.getReference(); final DatabaseReference contacts = update.child("contacts"); DatabaseReference id = contacts.child("mainUser"); id.runTransaction(new Transaction.Handler() { @Override public Transaction.Result doTransaction(MutableData mutableData) { Contact newContact = new Contact("Zero to hero", "+98 900 000 0000", "+98 11 000 00000"); mutableData.setValue(newContact); return Transaction.success(mutableData); } @Override public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) { if (b) { System.out.println("success"); } System.out.println(dataSnapshot.getValue().toString()); } }); }
گاهی نیاز دارید تا اطلاعات را به صورت لیست ارسال و دریافت کنید. در این موارد اهمیت از value به child تغییر میکند. در این مورد باید تغییراتی که روی child بوجود می آید را بررسی و دریافت کنیم.
private void insertList() { FirebaseDatabase db = FirebaseDatabase.getInstance(); DatabaseReference update = db.getReference(); DatabaseReference contacts = update.child("contacts"); DatabaseReference id = contacts.child("user1"); DatabaseReference mobile = id.child("mobile"); mobile.push().setValue("+98 911 000 0000"); mobile.push().setValue("+98 938 000 0000"); }
در متد بالا push یک DatabaseRefrence ایجاد میکند و با استفاده از آن میتوان mobile را به صورت یک لیست قرار داد.
private void readList() { FirebaseDatabase db = FirebaseDatabase.getInstance(); DatabaseReference update = db.getReference(); DatabaseReference contacts = update.child("contacts"); DatabaseReference id = contacts.child("user1"); final DatabaseReference mobile = id.child("mobile"); mobile.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot mobiles : dataSnapshot.getChildren()) { System.out.println(mobiles.getValue().toString()); } } @Override public void onCancelled(DatabaseError databaseError) { } }); }
وقتی با لیست ها کار میکنیم طبیعتا به مرتب سازی و دسته بندی آنها نیز نیاز خواهیم پیدا کرد.
Query query = mobile.orderByValue(); query.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { } @Override public void onCancelled(DatabaseError databaseError) { } });
همانطور که مشاهده میکنید تمام فعالیت های مربوط به آنرا میتوانید کنترل کنید.
همچنین اگر بخواهیم از بخشی از اطلاعات استفاده کنیم باید آنها را filter کنیم.
Query query = mobile.limitToFirst(3);
و مانند مرتب سازی از آن استفاده میکنیم.
در صورتی که برنامه در حالت offline باشد و بخواهید از تمام امکانات Database استفاده کنید نیاز است تا چنین دستوری را اضافه کنید
FirebaseDatabase db = FirebaseDatabase.getInstance(); db.setPersistenceEnabled(true);
در صورتی که بخواهید وضعیت دسترسی به Server را مشخص کنید
private void connection() { FirebaseDatabase db = FirebaseDatabase.getInstance(); db.setPersistenceEnabled(true); DatabaseReference connection = db.getReference(".info/connected"); connection.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { boolean connected = snapshot.getValue(Boolean.class); if (connected) { System.out.println("connected"); } else { System.out.println("not connected"); } } @Override public void onCancelled(DatabaseError error) { } }); }
در واقع با هر بار اتصال و یا قطع اتصال Reference مشخص شده بروزرسانی میشود.
در این مقاله به معرفی و استفاده از Database ها اشاره شد و در پایان سری مقالات آموزش Firebase در قالب یک پروژه تمام این آموزش هارا بکار خواهیم گرفت. در مقاله بعدی Cloud Messaging را مورد بررسی قرار خواهیم داد.
سری مقالات آموزش Firebase ادامه دارد.
با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
آموزش Gradle – اهمیت Project Automation
درک مفهوم کدنویسی تمیز در اندروید
5 هک ساده برای کاهش سایز فایل APK
آشنایی با RecyclerView در اندروید
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
6 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام دوباره بله هنوز کمافی السابق داره پول می گیره ولی تا ۱gb ش مجانیه و باید این رو هم گفت که هنوز برای ایران عزیزمون تحریمه … خدایا کی میشه ما به جای این سرویسای بی کیفیت وطنی از یه سرویس پروایدر خوب استفاده کنیم و لذتشو ببریم ینی تا کی…!!!؟
سلام و ممنون از مقالات خوبتون
فقط یه سوال …
من تا جایی که یادمه یکی دو سال پیش یه همچین مقاله ای رو تو یه سایت Androidhive.info دیده بودم و اون موقه خیلی هم خوشحال شدم از این کار گوگل ولی بعدا فهمیدم گوگل برای این سرویس پول دریافت میکنه ینی تا یه مقدارش رایگانه ولی از یه سطحی به بالا این سرویس پولی میشه امروز با خواندن مقاله شما دوباره به کنسول فایربیس رفتم و دیدم فایربیس ۳ تا گزینه فعالیت داره که یکیش همون spark و رایگانه و دوتای دیگه پولی و غیر مجانیه بعد چندتا سرویسش مثل تست گوگل و غیره رو در حالت Spark ارایه نمیده و غیر رایگان گذاشته بود و هرچی دنبال مبلغ برای سرویس دیتابیسش گشتم چیزی نبود حالا سوال من اینکه کلا این سرویس دیتابیس رایگان شده یا کما فی السابقه!؟
سلام، ممنون از پست خوبتون یه سوال
فقط برای developer بسته است یا پروژه هم زمان نصب نمیتونه دسترسی داشته باشه ؟ یعنی بعد از پابلیش هم به دیتابیس وصل نمیشه؟
سلام دوست عزیز. ممنون از همراهیتون. علاوه بر اینکه برای Developer بسته هست. اکثر قریب به همش در موقع استفاده هم غیر فعالن. تنها راهش تغییر IP هست که نمیشه روی برنامه هایی که قراره publish بشن اجرا بشه
با آی پی ایران کار نمیکنه؟ درسته؟ من وقتی تغییر آی پی میدم درست میشه اما بدون اون کار نکرد…راهی داره؟
سلام، خیر فعلا بخاطر تحریم عمده سرویس های firebase تحریمه ، تنها راهش فعلا تغییر IP هست