Android Dersleri – 42 – Firebase Kullanımı – 5

By | 21 Ekim 2020

Android Dersleri serisinin Firebase Kullanımı – 5 dersine hoş geldiniz. Bu dersimizde offline yani çevrimdışı işlemler konusuna değineceğiz.

Veritabanından verileri çeken basit bir uygulama geliştirdiğimizi düşünelim. O verilere erişebilmek için her zaman internet bağlantımızın olması gerekir. İnternetimizin olmadığı zamanlarda ise en son veriyi görüntülemek isteyebiliriz. İşte bunu nasıl yapabileceğimizi bu dersimizde görmüş olacağız. Bu, yapacağımız senaryolardan sadece birisi…

activity_main.xml dosyası;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:gravity="center"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:padding="25dp"
        android:text="show"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            
            <TextView
                android:id="@+id/txt_show"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textAlignment="center"
                android:padding="20dp"
                android:textSize="17sp"
                android:hint="- - -"/>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

MainActivity.java dosyası;

package com.mrcaracal.androiddersleriicinornekuygulama;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
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 {

    Button btn_show;
    TextView txt_show;

    FirebaseDatabase firebaseDatabse = FirebaseDatabase.getInstance();
    DatabaseReference databaseReferenceRead;

    private void init() {
        btn_show = findViewById(R.id.btn_show);
        txt_show = findViewById(R.id.txt_show);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("TAG1", "onCreate: MainActivity");
        init();

        setTitle("Sample Application");

        btn_show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                show();
            }
        });
    }

    private void show() {
        Log.i("TAG1", "show: method show");
        databaseReferenceRead = firebaseDatabse.getReference().child("users");
        
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String s = "";
                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    s = s + "\n" + "Username : " + dataSnapshot.child("username").getValue().toString() + "\n" +
                            "E-Mail : " + dataSnapshot.child("email").getValue().toString() + "\n";
                }
                txt_show.setText(s);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        };
        databaseReferenceRead.addValueEventListener(valueEventListener);
    }
}

SampleClass.java dosyası;

package com.mrcaracal.androiddersleriicinornekuygulama;

import android.app.Application;
import android.util.Log;

import com.google.firebase.database.FirebaseDatabase;

public class SampleClass extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
        Log.i("TAG1", "onCreate: SampleClass");
    }
}

Manifest dosyasına eklenecek olan satır;

SampleClass isminde bir sınıf oluşturduk ve içine

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

Bunu ekleyerek çevrimdışı bile olsak en son verilerin bize gösterilmesini sağlayan tek satırlık bir kod yazdık. Daha sonra SampleClass sınıfımızın daha uygulamanın en başından beri çalışmasını da sağlamak için manifest dosyasında application tag’ının içinde başına nokta “.” koyarak çağırmış olduk.

Uygulamamızı internet bağlantımız varken çalıştıralım. Daha sonra da uygulamayı kapatıp beraberinde internet bağlantısını da keselim ve uygulamamızı tekrar açalım. Görmüş olacaksınız ki verilerimizi yine de listelemiş olacağız.

Çevrimdışı Durumda Verileri Güncel Tutma

Şimdi farklı bir senaryo düşünelim. Geliştireceğimiz olan uygulamada kullanıcı her işlem yaptığında o verilerin firebase veritabanına işlenmesi gerekiyor. Ama aktif bir internet bağlantısı olmadan da uygulamayı, kullanıp işlemlerin yapılmasını sağlayıp ve daha sonradan internet bağlantısı sağlandığında offline durumdayken elde ettiğimiz verilerin firebase veritabanına işlenmesini istersek ne yapmalıyız onu görelim hemen.

Bunun için yapmamız gereken tek şey kodumuzun içine

databaseReferenceRead.keepSynced(true);

kod satırını eklemek.

Senaryoyu bir örnek üzerinden görelim bir de.

Görselde görüldüğü üzere internet bağlantımız yok ve Apollo4 bilgisini eklerken Apollo3 bilgisini ise siliyoruz. Uygulamayı kapatıp internet bağlantımızı tekrar açıp uygulamaya girdiğimizde offline yani çevrimdışı durumdayken yaptığımız işlemlerin firebase veri tabanına anından kendiliğinden işlendiğini gördük.

Çevrimdışı durumda verileri güncel tutma ile ilgili örnek uygulamanın kodları aşağıda yer almaktadır.

activity_main.xml dosyası;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/edt_nick"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:hint="Save By Nickname"/>

    <EditText
        android:id="@+id/edt_email"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:hint="Save E-Mail"/>

    <Button
        android:id="@+id/btn_save"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="save"/>

    <EditText
        android:id="@+id/edt_delete"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:hint="Delete By Nickname"/>

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="delete"/>

    <Button
        android:id="@+id/btn_show"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="show"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/txt_show"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textAlignment="center"
                android:padding="20dp"
                android:hint="- - -"/>

        </LinearLayout>
    </ScrollView>
</LinearLayout>

MainActivity.java dosyası;

package com.mrcaracal.androiddersleriicinornekuygulama;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
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.ValueEventListener;


public class MainActivity extends AppCompatActivity {

    EditText edt_nick, edt_email, edt_delete;
    Button btn_save, btn_show, btn_delete;
    TextView txt_show;

    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = firebaseDatabase.getReference();
    DatabaseReference databaseReferenceRead = firebaseDatabase.getReference();

    private void init(){
        edt_nick = findViewById(R.id.edt_nick);
        edt_email = findViewById(R.id.edt_email);
        btn_save = findViewById(R.id.btn_save);

        btn_show = findViewById(R.id.btn_show);
        txt_show = findViewById(R.id.txt_show);

        edt_delete = findViewById(R.id.edt_delete);
        btn_delete = findViewById(R.id.btn_delete);
    }

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

        btn_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                save();
            }
        });

        btn_show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                show();
            }
        });

        btn_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                delete();
            }
        });
    }

    private void save() {
        String nick = edt_nick.getText().toString().trim();
        String email = edt_email.getText().toString().trim();

        if (!nick.equals("") || !email.equals("")){
            userWrite(nick,nick,email);
        }else
            Toast.makeText(this, "Not Recorded", Toast.LENGTH_SHORT).show();
    }

    private void userWrite(String userId, String name, String email){
        User user = new User(name,email);
        databaseReference.child("users").child(userId).setValue(user);
    }

    private void show() {
        databaseReferenceRead = firebaseDatabase.getReference().child("users");

        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String s = "";
                for (DataSnapshot dataSnapshot : snapshot.getChildren()){
                    s = s + "\n" + "E-Mail : "+dataSnapshot.child("email").getValue().toString()+"\n"+
                            "Username : "+dataSnapshot.child("username").getValue().toString()+"\n";
                }
                txt_show.setText(s);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        };
        databaseReferenceRead.addValueEventListener(valueEventListener);
    }

    private void delete() {
        String deleteNick = edt_delete.getText().toString().trim();

        if (!deleteNick.equals("")){
            databaseReferenceRead = FirebaseDatabase.getInstance().getReference().child("users").child(deleteNick);
            databaseReferenceRead.removeValue();
        }else
            Toast.makeText(this, "Not Deleted", Toast.LENGTH_SHORT).show();
    }
}

User.java dosyası;

package com.mrcaracal.androiddersleriicinornekuygulama;

public class User {

    public String username;
    public String email;

    public User(String username, String email){
        this.username = username;
        this.email = email;
    }

    public User(){
    }
}

Bu dersimizde internet bağlantımız varken sahip olduğumuz en son verileri nasıl çevrimdışı iken görüntüleneceğini ve çevrimdışı durumdayken elde ettiğimiz verileri internet bağlantımız sağlandığında nasıl güncelleneceğini öğrenmiş olduk. Şimdilik Çevrimdışı işlemler ile ilgili dersimizin sonuna geldik bir sonraki dersimizde görüşmek üzere.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir