آموزش کار با Firebase Realtime Database (دیتابیس بهنگام فایربیس)

امتیاز 4.00 ( 1 رای )

سلام دوستان قبلا آموزش Push Notification رو با استفاده از فایربیس آموزش دادیم و امروز می خواهیم آموزش کار با Firebase Realtime Database (دیتابیس بهنگام فایربیس) به صورت جامع و کامل توضیح دهیم تا شمام هم از امکانات بسیار بالای این سرویس رو برخوردار شوید.
شاید به پرسید این Firebase Realtime Database چه امکاناتی رو می دهد و چه ضرر های ممکن اس داشته باشد.
مزایا :

  • به هنگام سازی بالا (نیازی نیست به طورت مداوم reuqest ارسال شود خودش تشخیص می دهد دیتا به گوشی رسیده است یا خیر)
  • ارسال آفلاین (به صورت آفلاین دیتایی ارسال نمی شود بعد از اینکه در هر لحظه گوشی کاربر به اینتنرت متصل شود دیتا یکجا ارسال می شود.)
  • یک دیتابیس رایگان ! (شما بدون خرید هاست یا سرور می توانید به یک دیتابیس با امکانالت فوق العاده بالا را داشته باشید.)
  • قابلیت ارتباط به صورت خیلی ساده
  • سرعت بسیار بالا
  • نامحدود دیتابیس می توانید داشته باشید.

معایب :

  • این سرویس از طرف گوگل برای ایران فیلتر شده است ولی می توانیم به آن دسترسی داشته باشیم و دیتا send و receive می شود.
  • در صورت که دیتاها برای شما مهم باشد یعنی یکسری دیتا های بسیار مهم بهتر است از این سرویس استفاده نکنید.

و این سرویس در ios , android , و بیشتر زبان های برنامه مانند سی شارپ می توانیم از آن استفاده کرد.
و برای اینکه قابلیت ذخیره دیتا به صورت افلاین رو فعال کنیم تا بعد از این که کاربر به اینترنت متصل شده دیتا به سرور منتقل شود برای این کار باید کد زیر را در اپ خود قرار دهیم نگران نباشید در ادامه توضیح میدیم این کد را باید کجا قرار دهیم.

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

قبل از اینکه وارد بخش کد نویسی اپ شویم دوست دارم کمی درمورد سرویس فایر بیس توضیح دهم در firebase امکان CRUD یا عملیات های (insert , update , select , delete) وجود دارد.
برای  انجام افزودن دیتا یا Inserting Data :
باید از متد setValue() استفاده کنیم. این متد کار insert یا update رو انجام می دهد.

DatabaseReference mRef = mDatabase.getReference("copyright");
mRef.setValue("©2017 programchi. All rights Reserved");

در کد بالا ما نود copyright را به دیتابیس اضافه می کنیم و مقدار آن را با ©2017 programchi. All rights Reserved قرار داده ایم.
و این رو بگم که این  real time database یا همان دیتابیس بهنگام دیتا های مختلفی مانند String, Long, Double, Boolean, Map<String, Object>, List<Object> را می پذیرد.
برای اینکه بخواهیم به طور مثال پروفایل کاربر را در آن ذخیره کنیم ابتدا یک constructor خالی بسازید .

@IgnoreExtraProperties
public class User {
    public String name;
    public String email;
    // Default constructor required for calls to
    // DataSnapshot.getValue(User.class)
    public User() {
    }
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
}

و باید برای هر یک id منحصر به فرد ساخت که خود فایبر بیس با استفاده از کد pus این کار رو می کند.

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("users");
// Creating new user node, which returns the unique key value
// new user node would be /users/$userid/
String userId = mDatabase.push().getKey();
// creating user object
User user = new User("hossein jfp", "jfp@orjinakteb.com");
// pushing user to 'users' node using the userId
mDatabase.child(userId).setValue(user);

در صورتی که کد بالا رو ران کنیم یک json به شکل زیر ساخته شده و سمت سرور ارسال می شود.

{
  "users": [
    "-KTYWvZG4Qn9ZYTc47O6" : {
      "email" : "jfp@orjinakteb.com",
      "name" : "hossein jfp"
    },
    {
      ...
    }
  ]
}

 
برای خواندن دیتا ( Read data ) می توانیم از کد زیر استفاده کنیم.

mDatabase.child(userId).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        User user = dataSnapshot.getValue(User.class);
        Log.d(TAG, "User name: " + user.getName() + ", email " + user.getEmail());
    }
    @Override
    public void onCancelled(DatabaseError error) {
        // Failed to read value
        Log.w(TAG, "Failed to read value.", error.toException());
    }
});

اپدیت دیتا (Updating Data)

String newEmail = 'jfp@gmail.com';
mDatabase.child(userId).child("email").setValue(newEmail);

کد بالا یوزری را که userId آن برابر با x باشد را اپدیت کرده.
حذف دیتا (Deleting Data)
برای این کار باید از کد removeValue استفاده کنیم.
تا اینجا فقط می خواستم کمی با فایر بیس و ساختر آن آشنا شوید حالا کد کلی را خواهید دید.
ابتدا به این لینک بروید قبلا توضیح دادیم در صورتی که نیاز بود لازم است ابتدا اکانت بسازید سپس لوگین کنید و روی create new Projecet را زده سپس شکل زیر برای شما می آید.

سپس فایل build.gradle رو باز کرد خط زیر را به آن اضافه کنید.

classpath 'com.google.gms:google-services:3.0.0'

بخش build.gradle این دفعه module را باز کرده سپس تغییرات رو اعمال کنید.

dependencies {
    // Adding support library for this demo app
    compile 'com.android.support:design:24.2.1'
     ///this
    compile 'com.google.firebase:firebase-database:9.6.1'
}
 //and this !
apply plugin: 'com.google.gms.google-services'

یک کلاس جاوا به نام User ایجاد کرده و کد های زیر را در آن قرار دهید کد های زیر سبب ذخیره اطاعات کاربر می شود. این کد را قبل تر توضیح دادیم !
 

import com.google.firebase.database.IgnoreExtraProperties;
/**
 * Created by JFP  on 07/10/16.
 * orjinakteb.com
 */
@IgnoreExtraProperties
public class User {
    public String name;
    public String email;
    // Default constructor required for calls to
    // DataSnapshot.getValue(User.class)
    public User() {
    }
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
}

فایل layout مربوط به activity_main.xml را باز کرده کد های زیر را  درآن قرار دهید.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="info.androidhive.firebase.MainActivity">
    <TextView
        android:id="@+id/txt_user"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingBottom="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_horizontal_margin"
        android:textSize="20dp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <EditText
                android:id="@+id/name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/name"
                android:inputType="textCapWords"
                android:maxLines="1" />
        </android.support.design.widget.TextInputLayout>
        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <EditText
                android:id="@+id/email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/email"
                android:inputType="textEmailAddress"
                android:maxLines="1" />
        </android.support.design.widget.TextInputLayout>
        <Button
            android:id="@+id/btn_save"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="@color/colorPrimary"
            android:text="@string/action_save"
            android:textColor="@android:color/white"
            android:textStyle="bold" />
    </LinearLayout>
</LinearLayout>

فایل MainActivity.java را باز کرده کد های زیر را در آن اعمال کنید خیلی ساده است و به راحتی می توانید متوجع کد های زیر شوید.
هدف ما ایجاد یک json است که شامل app_title برابر با نام اپ ما  و users برابر می شود با اطلاعات کاربر و به عنوان آرایه ای از node ذخیره می شود.

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private TextView txtDetails;
    private EditText inputName, inputEmail;
    private Button btnSave;
    private DatabaseReference mFirebaseDatabase;
    private FirebaseDatabase mFirebaseInstance;
    private String userId;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Displaying toolbar icon
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.mipmap.ic_launcher);
        txtDetails = (TextView) findViewById(R.id.txt_user);
        inputName = (EditText) findViewById(R.id.name);
        inputEmail = (EditText) findViewById(R.id.email);
        btnSave = (Button) findViewById(R.id.btn_save);
        mFirebaseInstance = FirebaseDatabase.getInstance();
        // get reference to 'users' node
        mFirebaseDatabase = mFirebaseInstance.getReference("users");
        // store app title to 'app_title' node
        mFirebaseInstance.getReference("app_title").setValue("Realtime Database");
        // app_title change listener
        mFirebaseInstance.getReference("app_title").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Log.e(TAG, "App title updated");
                String appTitle = dataSnapshot.getValue(String.class);
                // update toolbar title
                getSupportActionBar().setTitle(appTitle);
            }
            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.e(TAG, "Failed to read app title value.", error.toException());
            }
        });
        // Save / update the user
        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String name = inputName.getText().toString();
                String email = inputEmail.getText().toString();
                // Check for already existed userId
                if (TextUtils.isEmpty(userId)) {
                    createUser(name, email);
                } else {
                    updateUser(name, email);
                }
            }
        });
        toggleButton();
    }
    // Changing button text
    private void toggleButton() {
        if (TextUtils.isEmpty(userId)) {
            btnSave.setText("Save");
        } else {
            btnSave.setText("Update");
        }
    }
    /**
     * Creating new user node under 'users'
     */
    private void createUser(String name, String email) {
        // TODO
        // In real apps this userId should be fetched
        // by implementing firebase auth
        if (TextUtils.isEmpty(userId)) {
            userId = mFirebaseDatabase.push().getKey();
        }
        User user = new User(name, email);
        mFirebaseDatabase.child(userId).setValue(user);
        addUserChangeListener();
    }
    /**
     * User data change listener
     */
    private void addUserChangeListener() {
        // User data change listener
        mFirebaseDatabase.child(userId).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                User user = dataSnapshot.getValue(User.class);
                // Check for null
                if (user == null) {
                    Log.e(TAG, "User data is null!");
                    return;
                }
                Log.e(TAG, "User data is changed!" + user.name + ", " + user.email);
                // Display newly updated name and email
                txtDetails.setText(user.name + ", " + user.email);
                // clear edit text
                inputEmail.setText("");
                inputName.setText("");
                toggleButton();
            }
            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.e(TAG, "Failed to read user", error.toException());
            }
        });
    }
    private void updateUser(String name, String email) {
        // updating the user via child nodes
        if (!TextUtils.isEmpty(name))
            mFirebaseDatabase.child(userId).child("name").setValue(name);
        if (!TextUtils.isEmpty(email))
            mFirebaseDatabase.child(userId).child("email").setValue(email);
    }
}

در بالا ما یک

getReference(“app_title”)

یک نود به نام app_title ایجاد کرده و نام اپ را که در تولبار نوشته شده است را ذخیره می کند.
و

getReference(“users”)

به نود user دسترسی پیدا می کند
و متد زیر

createUser()

اطالاعات مربوط کاربر را ذخیره می کند.
و متد

updateUser()

اطلاعات کاربر مانند email , name  را آپدیت می کند (تغییر می دهد).
آموزش به اتمام رسید برنامه رو ران کنید و استفاده کنید.
 

مطالعه بیشتر