Android Realm Kullanımı

Realm Nedir?

Realm Veritabanı SQLite  gibi veritabanı yönetimine bir alternatiftir.  Kısaca açık kaynak kodlu bir veritanı yönetim sistemidir.
Java, Javascript, .Net, Objective-C ve Swift’de mevcut ve hem iOS hem de Android için tasarlanmıştır.
Sıfır-kopya tasarımı sayesinde, Realm Database bir ORM’den çok daha hızlıdır ve genellikle ham SQLite’den daha hızlıdır. Resimlerde de yapılan testlerde hızı gözle görülür derecededir.

Realm Get

realm
Query

 

realm inserts
Realm Insert

 

Örnek projeyi açmaya çalışırken hata alabilirsiniz ben Android Studio 3.1.3 de projeyi oluşturdum. Android Studio’nuz güncel olmalıdır.

Realm Kullanabilmek için bazı ön şartlar var bunlara dikkat etmelisiniz.

  • Android Studio sürüm 1.5.1 veya üstü
  • JDK sürüm 7.0 veya üstü
  • Android SDK’nın yeni bir sürümü
  • Android API Seviye 9 veya üstü (Android 2.3 ve üstü)

Not: Realm, Android’in dışında Java’yı desteklemez. Artık Eclipse’i bir IDE olarak desteklemiyoruz; lütfen Android Studio’ya geçin.

Gerekli detaylara Realm’ın anlatımından da bakabilirsiniz.
https://realm.io/docs/java/latest

Örnek olarak hazırlamış olduğum Ad Soyad ve Yaş bilgisini listview’e ekleme ve daha sonra listedeki herhangibir elemanı üzerine tıklayınca silme işlemi, uzun basılı tutunca da seçilen elemanı düzenleyip güncelleme işlemi yapan basit bir örnek oluşturdum. Dilerseniz bu örneği indirip kodları inceleyebilirsiniz. Kodlar açıklamalarla belirtilmiştir. İleriki zamanlarda daha detaylı olarak fırsat buldukça yazacağım.

build.gradle(Project) dependencies ‘ın altına ekliyoruz.

classpath "io.realm:realm-gradle-plugin:5.3.0"

build.gradle (Module:app) application’ın hemen altına yapıştırıyoruz

apply plugin: 'com.android.application'
apply plugin: 'realm-android'

Şimdi Application sınıfımızı oluşturacağız.

package com.realm.database.info.unalzafer;

import android.app.Application;

import io.realm.Realm;
import io.realm.RealmConfiguration;

public class MyRealmApplication extends Application {

    public void onCreate() {
        super.onCreate();
        Realm.init(this);
        RealmConfiguration realmConfiguration=new RealmConfiguration.Builder().build();
        Realm.setDefaultConfiguration(realmConfiguration);
    }
}

Android Manifest.xml dosyasında application’in içerisine aşağıdaki kodu ekliyoruz. url bölümünü kendi uygulamanıza göre düznelemeyi unutmayın.

android:name="com.realm.database.info.unalzafer.MyRealmApplication"

Kendi uygulamamda oluşturduğum InfoModel java classı üzerinden anlatıyorum sizler de kendi class’ınızı oluşturduğunuzda gerekli değişimleri yapabilirsiniz. Class oluşturduktan sonra RealmObject extends ediyoruz. Daha sonra gerekli olan değişkenleri yazıyoruz. Biz burada int id olarak tanımladığımız “id” değişkenini main activty de göndereceğimiz primery key olarak da bildiğimiz her realm objesinin id sini veriyoruz. toString olarak tanımladığım ise yazılan her objeyi textview de görüntülemek için kullandım. Daha sonra değişkenlerimizin get set değerlerini tanımlıyoruz ki bunlara değer set edebilelim.

package com.realm.database.info.unalzafer;

import io.realm.RealmObject;

public class InfoModel extends RealmObject {
    private int id;
    private  String name;
    private  String age;

    @Override
    public String toString() {
        return "Ad Soyad="+name+
                "  Yaş="+age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

 

Şimdi geldik en önemli bölüme. Mainactivity.java da yapacak olduğumuz bağlantılar  neler olacak şimdi tek tek açıklayalım. İlk olarak Realm’i global olarak tanımlayalım.

Realm realm;

oncreate in içerisinde de atamasını yapalım.

realm=Realm.getDefaultInstance();
showInfo(); //eğer önceden eklenen veri var ise göstermek için method oluşturduk

eğer kaydedilen verileri silmek istiyorsanız aşağıdaki kodu kullanabilirsiniz.

/*
//her uygulama başlangıcında datayı sıfırlar
realm.beginTransaction();
realm.deleteAll();
realm.commitTransaction();
*/

Şimdi datayı kaydetmeyi öğrenelim. Realm ile data nasıl kaydedilir?
Uygulama üzerinden anlatıyorum siz bu bölümü istediğiniz yerde çağırabilirsiniz. Kaydet butonunun onclick methodunu yazdık. Butona tıklanınca yapılacaklar altta açıklamalı olarak belirttim.

public void Kaydet(View view) {

    if(btnSave.getText().toString().equalsIgnoreCase("Güncelle")){
        update();
    }else {
        //girilen datayı set etme

        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm bgRealm) {


                //primary key için otomatik arttırma
                Number maxId = bgRealm.where(InfoModel.class).max("id");
                int nextId = (maxId == null) ? 1 : maxId.intValue() + 1;

                InfoModel duaModel = bgRealm.createObject(InfoModel.class);
                duaModel.setId(nextId); //key olarak tanımladık
                duaModel.setName(etName.getText().toString());
                duaModel.setAge(etAge.getText().toString());
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                // Kayıt Başarılı Bir Şekilde Gereçekleşti ise
                showInfo();
                clearText();
                Toast.makeText(MainActivity.this, "Kayıt başarılı bir şekilde eklendi.", Toast.LENGTH_SHORT).show();
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                // Kayıt Başarısız ise bu bölüm çalıştırılır
            }
        });

    }

}

Verileri şuan realm veritabanına ekledik. eklediğimiz verileri şimdi görüntülemek için listview ekledik ve yazdırdık.

public  void showInfo(){
    //datayı okuma ve listview de gösterme

    stringArrayList.clear();
    RealmResults<InfoModel> realmResults=realm.where(InfoModel.class).findAll();
    int i=0;
    for(InfoModel infoModel:realmResults){
        try {

            stringArrayList.add(infoModel.toString());
            i++;
        }catch (NullPointerException e){
            e.printStackTrace();
        }

    }
    arrayAdapter=new ArrayAdapter<String>
            (this, android.R.layout.simple_list_item_1, android.R.id.text1,stringArrayList);
    lvInfo.setAdapter(arrayAdapter);
    
}

Veritabanından eleman silmek için mainactivity içerisinde delete methodu oluşturduk.

//tek tek eleman silmek için. seçileni siler
private  void delete(final int position) {
    final RealmResults<InfoModel> realmResults=realm.where(InfoModel.class).findAll();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            InfoModel dog = realmResults.get(position);
            dog.deleteFromRealm();
            refreshList();

        }
    });
}

Realm veritabanında eğer bir değişiklik yapmışsak bunu anlık güncellemek için aşağıdaki methodu kullanabilirsiniz. Örnek uygulamayı indirirseniz daha basit olarak anlayabilirsiniz.

private void refreshList() {

    //Listedeki datalarıdan sildiğimizde listview e güncelleme atıyoruz
    RealmResults<InfoModel> realmResults = realm.where(InfoModel.class).findAll();
    stringArrayList.clear();
    for(InfoModel infoModel: realmResults){
        stringArrayList.add(String.valueOf(infoModel));
    }
    arrayAdapter.notifyDataSetChanged();

}

şimdi de geriye kalan güncelleme gibi kısımları ekliyorum açıklamalar içerisinde mevcut bazı methodları da ekledim ki arayarak da bulabilirsiniz.

private void duzenle(int position) {

    //listedeki herhamgi bir elemana uzun süre basılı tutunca elamnın değerlerini edittextlere yazdırıyoruz
    RealmResults<InfoModel> realmResults = realm.where(InfoModel.class).findAll();
    final InfoModel updateTable = realmResults.get(position);
    screenText(updateTable.getName(),updateTable.getAge());
    btnSave.setText("Güncelle");
    this.selectPos=position;

}

private void screenText(String name, String age) {
    etName.setText(name);
    etAge.setText(age);
}

//güncelleme bölümü
private  void update(){
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm bgRealm) {

            RealmResults<InfoModel> realmResults = Realm.getDefaultInstance().where(InfoModel.class).findAll();
            final InfoModel updateTable = realmResults.get(selectPos);
            updateTable.setName(etName.getText().toString());
            updateTable.setAge(etAge.getText().toString());

        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            Toast.makeText(MainActivity.this, "Kayıt başarılı bir şekilde güncellendi.", Toast.LENGTH_SHORT).show();
            refreshList();
            clearText();
            btnSave.setText("Kaydet");

        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            Toast.makeText(MainActivity.this, ""+error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

//edittextleri temizlemek için
private void clearText(){
    etName.setText("");
    etAge.setText("");
}

https://github.com/unalzafer/Realm

realm-ornek
realm-ornek

 

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.