Site icon Mobilhanem

Android Firebase Veritabanı CRUD İşlemleri

Merhaba arkadaşlar,

Bu dersimizde Google’un öne sürdüğü Firebase platformunun Realtime Database bulut servisini inceleyeceğiz. Ayrıca, gerçek zamanlı Firebase  Veritabanı kullanarak CRUD (Create, Read, Update, Delete ) işlemlerini nasıl yapabileceğimizi de anlatacağım. Bildiğiniz üzere Firebase platformu sayesinde bir çok işlemi gerçekleştirebiliyoruz ve bu platform  ( Realtime database, cloud messaging, crash reporting, storage, authentication gibi özellikleri kullanabilmemizi sağlıyor. ) Firebase ayrıca NOSQL bir veritabandır yani hiç bir SQL sorgusu yazmadan gerekli tabloları oluşturup json formatı ile kontrol ederiz.

Cloud Messaging ile Push Notification gönderme dersimizi daha önce anlatmıştık bu linkten inceleyebilirsiniz.

Ayrıca banner reklam ekleme desteği ile ilgili dersimizi de bu linkten inceleyebilirsiniz.

Örneğin üye giriş, çıkış ve kayıt işlemlerini authentication özelliğini kullanarak firebase in bize sunmuş olduğu servis sayesinde kısa yoldan halledebiliriz. Geliştirilen bir çok uygulama platform bağımsız olarak düşünüldüğünde aynı veriye her cihazdan erişmek ister. Uygulamalarda en çok önemli olan kaynakta veridir. Geliştirdiğiniz uygulamada login sistemi yer alıyorsa kullanıcı bilgilerine erişme, saklama ; uygulamanızı kullanan kişilerin bir takım bilgilerden haberdar olmasını istiyorsanız bildirim gönderme; uygulamanızın verilerini analiz edip, kaç crash yaşanmış hangi cihazlarda yaşanmış vb. gibi ayrıntılı crash raporlarına ulaşma ; ayrı bir veritabanı ve sunucu desteği oluşturmadan gerçek zamanlı verilere ulaşma gibi bir çok özelliği içinde barındıran firebase platformunu daha kapsamlı incelemek için kendi sitesini inceleyebilirsiniz. ( https://firebase.google.com )

Android Firebase Veritabanı CRUD İşlemlerini oluşturmak için gerekli adımları oluşturmaya başlayalım. Öncelikle android uygulamamızı oluşturuyoruz. Android Studio yu açtığımızda resimdede gördüğünüz gibi Tools sekmesinden Firebase seçeneğinde tıklıyoruz.( Tools -> Firebase )

Karşımızda çıkan ve yukarıda da bahsetmiş olduğum özelliklerden Realtime Database tıklıyoruz.

Daha sonra karşımıza çıkan pencerede çıkan seçenekleri uyguluyoruz. ( 1-Connect to Firebase ,

2- Add the Realtime Database to your app vb. ) Connect to Firebase dediğimizde developer console hesabımız olması gerekiyor zaten giriş yapmadıysanız uyarıyı alacaksınız bende gmail hesabım ile girişimi gerçekleştiriyorum. Buradaki işlemleri uyguladığımızda android studio da otomatik olarak gerekli alt yapıyı bize çıkaracaktır.

Android uygulamamızın adını yazıyoruz, Connect to Firebase tıklıyoruz ve hemen ardından Accept Changes diyoruz. Console Firebase sitesine girdiğimizde android uygulamamızı yarattığımızı görüyoruz.

Yukarıda gördüğünüz gibi uygulamamızı database realtime için hazır hale getirdik şimdi veritabanına read ve write işlemlerini yapabilmemiz için bu platformdan izin vermemiz gerekiyor. RULES yazan kısımdan read ve write işlemlerini true yapıp Publish ediyoruz.

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

( Firebase de bulunan bu rules sayesinde kullanıcıların yetkilerini kısıtlayabilir , sadece belirli verilere erişmesini sağlayabilir ve kendi kurduğunuz yapıya göre olmasını istediğiniz kontrolleri ekleyebilirsiniz. )

Şimdi uygulamamızda kullanacağımız veritabanı yapısını oluşturalım ben Müşteri -> Sipariş ilişkisini kullanacağım. Her bir müşteri farklı farklı siparişler verebilir. Örneğin x müşterisinin ; T-shirt aldığını düşünelim. y müşteriside gömlek alabilir. Yani bir müşteri birden fazla ürün sipariş verebilir. Veritabanı chartımız da aşağıdaki gibidir.

Veritabanımız şekillendiğine göre şimdi kodlamaya geçebiliriz , Customer ve Order Modellerimizi oluşturalım.

Customer.java

package com.mobilhanem.androidcrudexample.model;

/**
 * Created by alper on 22/04/2017.
 */

public class Customer {
    private String customerId;
    private String customerName;
    private String customerAddress;

    public Customer(){

    }


    public String getCustomerId() {
        return customerId;
    }

    public void setCustomerId(String customerId) {
        this.customerId = customerId;
    }

    public String getCustomerName() {
        return customerName;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getCustomerAddress() {
        return customerAddress;
    }

    public void setCustomerAddress(String customerAddress) {
        this.customerAddress = customerAddress;
    }

    public Customer(String customerId, String customerName, String customerAddress){

        this.customerId = customerId;
        this.customerName = customerName;
        this.customerAddress = customerAddress;
    }
}

Order.java

package com.mobilhanem.androidcrudexample.model;

/**
 * Created by alper on 22/04/2017.
 */

public class Order {

    private String orderId;
    private String orderName;
    private int orderPrice;

    public Order(){


    }

    public Order(String orderId, String orderName, int orderPrice) {
        this.orderId = orderId;
        this.orderName = orderName;
        this.orderPrice = orderPrice;
    }


    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    public int getOrderPrice() {
        return orderPrice;
    }

    public void setOrderPrice(int orderPrice) {
        this.orderPrice = orderPrice;
    }

}

Modellerimizi tanımladıktan sonra MainActivity sınıfımıza bakalım. Kodları incelerseniz eğer uygulama ilk açıldığında onStart methodunda Database reference üzerinden DataSnapshot ile child lara ulaşıyoruz ve ilgili kayıtlar var ise Customer modeline atarak Recyclerview in adapterına set ediyoruz. Böylece realtime database de Customer ile ilgili kaç kayıt var ise hepsini getirip ekranda göstermiş oluyoruz.

Veritabanında herhangi bir değişikliği dinlemek için addValueEventListener()  yapısını kullanıyoruz. Uygulamamızda göreceğiniz gibi veritabanında bir değişiklik yaptığımızda örneğin update, delete anında o verinin değiştiğini göreceksiniz. Firebase console dan da girerek örneğin; müşterinin adını değiştirdiğimizde android uygulamamızda yer alan müşterinin adınında otomatik olarak değiştiğini göreceksiniz.

Bir önceki makalede addValueEventListener() isimli veri tabanı dinleyicisini kullanmıştık. Bu dinleyici; veri tabanında her hangi bir değişiklik olduğunda harekete geçerek veri tabanının güncel halini bize göstermektedir.

MainActivity de customer yapısını göstereceğimiz için onCreate methodunda reference ulaşıyoruz.

DatabaseReference  databaseReferenceCustomers = FirebaseDatabase.getInstance().getReference("customers");

Kayıt işlemi içinde aşağıdaki yapıyı oluşturuyoruz. FloatingButtona basıldığı anda ;her kayıt birbirinden farklı olması için bir id alıyoruz (customerId) kullanıcı uygulamada müşteri adını soyadını girdiğinde ve adres spinnerdan ilgili adresi seçtiğinde customer objesini oluşturuyoruz. Database reference in child methoduna id yi atıp setValue ile customer objemizi kaydediyoruz. Uygulama içinden kayıt işlemini bu şekilde yapıyoruz ayrıca firebase platformundan kendi oluşturduğumuz bir json dosyasını import ederek de kayıtları oluşturabiliriz.

String id = databaseReferenceCustomers.push().getKey();
Customer customer = new Customer(id,editText.getText().toString(),spinner.getSelectedItem().toString());
databaseReferenceCustomers.child(id).setValue(customer);

Uygulamamızı çalıştırıp customer ve order eklediğimizde aşağıdaki json çıktısını aldığımızı göreceksiniz.

MainActivity.java

package com.mobilhanem.androidcrudexample;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

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;
import com.mobilhanem.androidcrudexample.adapter.CustomerAdapter;
import com.mobilhanem.androidcrudexample.model.Customer;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements ItemClickListener {

    public static final String CUSTOMER_NAME = "com.mobilhanem.androidcrudexample.customername";
    public static final String CUSTOMER_ID = "com.mobilhanem.androidcrudexample.customerid";
    private Spinner spinner;
    private EditText editText;
    private FloatingActionButton floatingActionButton;
    private DatabaseReference databaseReferenceCustomers;
    private List<Customer> customers;
    private RecyclerView mRecyclerView;
    private RecyclerView.LayoutManager mLayoutManager;
    //private RecyclerView.Adapter mAdapter;
    private CustomerAdapter customerAdapter;

    @Override
    protected void onStart() {
        super.onStart();
        databaseReferenceCustomers.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                customers.clear();

                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                    Customer customer = postSnapshot.getValue(Customer.class);
                    customers.add(customer);
                }


                mRecyclerView.setHasFixedSize(true);

                // use a linear layout manager
                mLayoutManager = new LinearLayoutManager(MainActivity.this);
                mRecyclerView.setLayoutManager(mLayoutManager);

                customerAdapter = new CustomerAdapter(MainActivity.this, customers);
                customerAdapter.setClickListener(MainActivity.this);
                mRecyclerView.setAdapter(customerAdapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        databaseReferenceCustomers = FirebaseDatabase.getInstance().getReference("customers");

        spinner = (Spinner)findViewById(R.id.spinnerArray);
        editText = (EditText)findViewById(R.id.edittextName);
        floatingActionButton = (FloatingActionButton)findViewById(R.id.addCustomer);
        mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);

        customers = new ArrayList<>();

        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addCustomer();
            }
        });


    }

    private void addCustomer() {

        if(editText.getText().length()>0){

            String id = databaseReferenceCustomers.push().getKey();
            Customer customer = new Customer(id,editText.getText().toString(),spinner.getSelectedItem().toString());
            databaseReferenceCustomers.child(id).setValue(customer);
            editText.setText("");
            Toast.makeText(getApplicationContext(),"Yeni Müşteri Eklendi",Toast.LENGTH_SHORT).show();

        }else {
            showAlertDialog();
        }
    }

    private void showAlertDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("Hata");
        builder.setMessage("Lütfen Müşteri Adını Giriniz!");

        String positiveText = "TAMAM";
        builder.setPositiveButton(positiveText,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // positive button logic
                    }
                });

        AlertDialog dialog = builder.create();
        // display dialog
        dialog.show();
    }

    @Override
    public void onClick(View view, int position) {
        Customer customer = customers.get(position);

        Intent intent = new Intent(getApplicationContext(), DetailActivity.class);
        intent.putExtra(CUSTOMER_ID, customer.getCustomerId());
        intent.putExtra(CUSTOMER_NAME, customer.getCustomerName());
        startActivity(intent);
    }
}

Kaydettiğimiz müşterileri ekranda gösterirken kullandığımız Recyclerview in Adapter yapısıda aşağıdadır. Adapter yapısını inceledğimizde müşteri güncelleme ve müşteri silme işlemlerinde yer aldığını göreceksiniz.

Recyclerview de listelediğimiz müşterilerden birini silmek için yapılan işlemler ; hangi müşteriyi silmek istiyorsak o müşterinin customerId sine göre ilgili reference çekiyoruz ve removeValue() fonksiyonu ile kayıtı siliyoruz. Tabi bu müşterinin siparişleri de olabilir bu yüzden sadece müşteriyi silmek yetmez; ilgili müşterinin siparişini de çekip removeValue() ile kaldırıyoruz.

int id = customerList.get(position).getCustomerId();
DatabaseReference dR = FirebaseDatabase.getInstance().getReference("customers").child(id);
dR.removeValue();
DatabaseReference drOrders = FirebaseDatabase.getInstance().getReference("orders").child(id);
drOrders.removeValue();

Recyclerview de listelediğimiz müşterilerden birini güncellemek için yapılan işlemler ise yine aynı mantıkla aşağıda gösterilmiştir.

DatabaseReference dR = FirebaseDatabase.getInstance().getReference("customers").child(updateCustomer.getCustomerId());
Customer customer = new Customer(updateCustomer.getCustomerId(),editTextName.getText().toString(),spinnerUpdate.getSelectedItem().toString());
dR.setValue(customer);

CustomerAdapter.java

package com.mobilhanem.androidcrudexample.adapter;

import android.app.AlertDialog;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.mobilhanem.androidcrudexample.ItemClickListener;
import com.mobilhanem.androidcrudexample.R;
import com.mobilhanem.androidcrudexample.model.Customer;

import java.util.List;

/**
 * Created by alper on 23/04/2017.
 */

public class CustomerAdapter extends RecyclerView.Adapter<CustomerAdapter.ViewHolder> {

    List<Customer> customerList;
    Context context;
    private ItemClickListener clickListener;

    public CustomerAdapter(Context context, List<Customer> customerList) {

        this.customerList = customerList;
        this.context = context;
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        public TextView customerName;
        public TextView customerAddress;
        public ImageView customerPhoto;
        public ImageView optionMenu;


        public ViewHolder(View view) {
            super(view);

            customerName = (TextView)view.findViewById(R.id.customerName);
            customerAddress = (TextView)view.findViewById(R.id.customerAddress);
            customerPhoto = (ImageView)view.findViewById(R.id.customer_photo);
            optionMenu = (ImageView)view.findViewById(R.id.optionMenu);
            view.setTag(view);
            view.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            if (clickListener != null) clickListener.onClick(v, getAdapterPosition());
        }
    }

    @Override
    public CustomerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.customeradapter_item, parent, false);

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {

        holder.customerName.setText(customerList.get(position).getCustomerName());
        holder.customerAddress.setText(customerList.get(position).getCustomerAddress());
        holder.customerPhoto.setImageResource(R.drawable.user);
        holder.optionMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                PopupMenu popup = new PopupMenu(context, holder.optionMenu);
                popup.inflate(R.menu.menu_items);
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.edit:
                                //update customer
                                updateCustomer(customerList.get(position));
                                break;
                            case R.id.delete:
                                //delete customer
                                deleteCustomer(customerList.get(position).getCustomerId());
                                break;
                        }
                        return false;
                    }
                });
                //displaying the popup
                popup.show();

            }
        });

    }

    private Customer updateCustomer;
    private void updateCustomer(Customer customer) {

        updateCustomer = customer;
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE);
        final View dialogView = inflater.inflate(R.layout.update_dialog, null);
        dialogBuilder.setView(dialogView);

        final EditText editTextName = (EditText) dialogView.findViewById(R.id.editTextName);
        final Spinner spinnerUpdate = (Spinner) dialogView.findViewById(R.id.spinnerUpdate);
        final Button buttonUpdate = (Button) dialogView.findViewById(R.id.buttonUpdateCustomer);

        editTextName.setText(updateCustomer.getCustomerName());

        dialogBuilder.setTitle("Müşteri Düzenleme");
        final AlertDialog b = dialogBuilder.create();
        b.show();

        buttonUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(editTextName.getText().length()>0){

                    DatabaseReference dR = FirebaseDatabase.getInstance().getReference("customers").child(updateCustomer.getCustomerId());
                    Customer customer = new Customer(updateCustomer.getCustomerId(),editTextName.getText().toString(),spinnerUpdate.getSelectedItem().toString());
                    dR.setValue(customer);
                    b.dismiss();
                    Toast.makeText(context, "Müşteri Güncellendi", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void deleteCustomer(String id) {

        DatabaseReference dR = FirebaseDatabase.getInstance().getReference("customers").child(id);
        dR.removeValue();
        DatabaseReference drOrders = FirebaseDatabase.getInstance().getReference("orders").child(id);
        drOrders.removeValue();
        Toast.makeText(context ,"Müşteri Silindi", Toast.LENGTH_SHORT).show();
    }

    public void setClickListener(ItemClickListener itemClickListener) {
        this.clickListener = itemClickListener;
    }

    @Override
    public int getItemCount() {
        return customerList.size();
    }
}

Recyclerview da müşteriye tıkladığımızda ilgili müşterinin siparişlerinin olduğu sayfaya gidiyoruz. Yine daha önceden eklenen bir sipariş kaydı var ise ekranda gösteriyoruz. Ayrıca yeni bir sipariş girip kayıt edebiliyoruz.

DetailActivity.java

package com.mobilhanem.androidcrudexample;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

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.Query;
import com.google.firebase.database.ValueEventListener;
import com.mobilhanem.androidcrudexample.adapter.CustomerAdapter;
import com.mobilhanem.androidcrudexample.adapter.OrderAdapter;
import com.mobilhanem.androidcrudexample.model.Order;

import java.util.ArrayList;
import java.util.List;

public class DetailActivity extends AppCompatActivity {

    private DatabaseReference databaseOrders;
    private TextView customerName;
    private ListView listView;
    private EditText editText, editTextPrice;
    private FloatingActionButton floatingActionButton;
    private OrderAdapter orderAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private RecyclerView recyclerView;
    List<Order> orderList;

    @Override
    protected void onStart() {
        super.onStart();
        databaseOrders.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                orderList.clear();
                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                    Order order = postSnapshot.getValue(Order.class);
                    orderList.add(order);
                }
                recyclerView.setHasFixedSize(true);
                // use a linear layout manager
                mLayoutManager = new LinearLayoutManager(DetailActivity.this);
                recyclerView.setLayoutManager(mLayoutManager);

                orderAdapter = new OrderAdapter(DetailActivity.this, orderList);
                recyclerView.setAdapter(orderAdapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

    private void showAlertDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(DetailActivity.this);
        builder.setTitle("Hata");
        builder.setMessage("Lütfen Sipariş/Fiyat Giriniz!");

        String positiveText = "TAMAM";
        builder.setPositiveButton(positiveText,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // positive button logic
                    }
                });

        AlertDialog dialog = builder.create();
        // display dialog
        dialog.show();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        Intent intent = getIntent();

        databaseOrders = FirebaseDatabase.getInstance().getReference("orders").child(intent.getStringExtra(MainActivity.CUSTOMER_ID));

        customerName = (TextView)findViewById(R.id.customerName);
        customerName.setText(intent.getStringExtra(MainActivity.CUSTOMER_NAME));

        recyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
        floatingActionButton = (FloatingActionButton)findViewById(R.id.addOrders);
        editText = (EditText)findViewById(R.id.edittextName);
        editTextPrice = (EditText)findViewById(R.id.edittextprice);

        orderList = new ArrayList<>();

        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(editText.getText().length()>0 && editTextPrice.getText().length()>0){

                    String id  = databaseOrders.push().getKey();
                    Order order = new Order(id, editText.getText().toString(),Integer.parseInt(editTextPrice.getText().toString()));
                    databaseOrders.child(id).setValue(order);
                    Toast.makeText(getApplicationContext(),"Yeni Sipariş Eklendi",Toast.LENGTH_SHORT).show();
                    editText.setText("");
                    editTextPrice.setText("");

                }else{

                    showAlertDialog();
                }
            }
        });

    }
}

Gördüğünüz gibi Firebase veritabanı sistemi NOSQL olarak çalıştığı için tablolar yoktur ve sorgu yazmaya gerek kalmadan kolayca CRUD işlemlerini gerçekleştirebilirsiniz. En önemli özelliği ise asenkron olarak çalışarak ; anlık veri değişimlerini kullanıcıya gösterebilmesidir.  Örneğin müşteri kaydı yapıyoruz ve bağlantı yok bu offline durumunda ise çalışmaya devam ederek gerekli bağlantı sağlandığı anda güncellemeyi yaparak kullanıcıya değişikliği gösterir. Firebase gerçekten çok kapsamlı ve performanslı bir yapıya sahip bu yüzden detaylı olarak inceleyip örnekleri arttırmak gerekir. Ben sadece temel olarak sizlere firebase veritabanı yapısını CustomerOrder ilişisi üzerinden anlatmaya çalıştım.

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

Mobilhanem.com üzerinden anlattığımız mobil uygulama geliştirme derslerine devam edeceğiz. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitemizden de sorabilirsiniz.

Bir dahaki dersimizde görüşmek dileğiyle..

20
Exit mobile version