Android Realm Veritabanı Kullanımı

Merhaba arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız derslere bugün sizlere Realm Veritabanı Kullanımı nı  anlatan bir uygulama yapacağım.

Realm açık kaynaklı veritabanı yönetim sistemidir. Realm veritabanı kullanımı kolay, sqlite veritabanına göre query oluşturma konusunda daha performanslı bir yapıya sahip. Dokümantasyon olarak gerçekten özenle hazırlanmış ve her ayrıntıya değinen bir anlatım da realm kendi sitesinde mevcut. Realm veritabanı ; Java, Swift, Objective-C, Javascript ve .NET gibi bir çok yazılıma da destek vermektedir.

Android Studio 3.1 versiyonu ile projemizi oluşturmaya başlayacağız eğer Android Studio nuz güncel değilse ve buradaki kaynak kodu indirip denemeye çalışırsanız hata alabilirsiniz.

Realm kullanabilmek için bazı ön koşullar bulunmaktadır :

  • Android Studio 1.5.1 veya üstü
  • JDK 7.0 veya üstü
  • Güncel Android SDK sürümü
  • Android API Level 9 ve üstü

Realm ile kullanılabilecek özellikler aşağıdaki şekilde yer almaktadır.

Android Studio da yeni bir proje oluşturuyoruz daha sonra proje seviyesindeki build.gradle dosyamızı aşağıdaki gibi düzenliyoruz. dependencies kısmında gördüğünüz gibi realm plugin kısmını tanımladık.

Project level: build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0'
        classpath "io.realm:realm-gradle-plugin:5.0.0"


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }

}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Daha sonra uygulama seviyesinde bulunan build.gradle dosyamıza aşağıdaki kod parçacığını ekliyoruz.

apply plugin: 'realm-android'

Aşağıda gördüğünüz gibi ilgili kodu ekledik dependencies kısmında uygulamamızda kullanacağımız gerekli kütüphaneleri import ettik. Android Studio 3.1 güncellemesi ile artık “compile” yerine “implementation” kullandığımızı görüyorsunuz.  ( not: 2018 sonu itibarı ile de artık compile kullanımı kalkacak o yüzden şimdilik compile ile kütüphaneleri çekseniz bile artık “implementation” ile kullanmaya dikkat edelim. )

build.gradle

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

android {
    compileSdkVersion 25
    buildToolsVersion '27.0.3'
    defaultConfig {
        applicationId "com.mobilhanem.realmdatabaseapp"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "com.android.support:appcompat-v7:25.3.1"
    implementation "com.android.support:cardview-v7:25.3.1"
    implementation "com.android.support:design:25.3.1"
    implementation "com.android.support:recyclerview-v7:25.3.1"
    implementation "com.android.support:support-annotations:25.3.1"
    implementation "com.android.support:support-v4:25.3.1"
    testImplementation 'junit:junit:4.12'
}

Şimdi Application sınıfımızı oluşturacağız. “denemeapp” ismini verdiğimiz Realm Veritabanı konfigürasyonunu aşağıda gördüğünüz gibi belirtiyoruz.

RealmApplication.java

package com.mobilhanem.realmdatabaseapp.apps;

import android.app.Application;

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

/**
 * Created by alper on 27.03.2018.
 */

public class RealmApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this);
        RealmConfiguration configuration = new RealmConfiguration.Builder().name("denemeapp.realm").deleteRealmIfMigrationNeeded().build();
        Realm.setDefaultConfiguration(configuration);
    }
}

Daha sonra oluşturduğumuz bu application sınıfını AndroidManifest.xml de tanımlamamız gerekiyor. application tag i içinde android:name de yarattığımız application sınıfını tanımladık.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mobilhanem.realmdatabaseapp">

    <application
        android:name=".apps.RealmApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Projemizin genel olarak şablonu aşağıdadır. Kullanacağımız her modülü ayrı paketler altına tanımladık.

Şimdi uygulamamızda kullanacağımız model yapısını oluşturalım. Bu uygulamamızda kişiler üzerinden gideceğimiz için PersonTable adını verdiğimiz bir model oluşturuyoruz. Bu sınıfımızı RealmObject sınıfından extend ettik. Veritabanı işlemlerinde kullandığımız primary key kavramı burada da karşımıza çıkıyor aşağıda gördüğünüz gibi id değerimizi @PrimaryKey ile bu özelliği kazandırıyoruz. Daha sonra name, surname, department ve age gibi parametreleri de tanımladık. @RealmClass tagini kullanarak da oluşturduğumuz bu sınıfın Realm sınıfına ait olduğunu gösterdik.

PersonTable.java

package com.mobilhanem.realmdatabaseapp.model;

import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.RealmClass;

/**
 * Created by alper on 27.03.2018.
 */

@RealmClass
public class PersonTable extends RealmObject {

    @PrimaryKey
    private int id;
    private String name;
    private String surname;
    private String department;
    private int age;

    public String getName() {
        return name;
    }

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

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public int getId() {
        return id;
    }

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

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public int getAge() {
        return age;
    }

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

}

RecylerView de tanımladığımız CardView içinde bulunan iç noktaya tıklandığında tıklama eventini MainActivity de yakalayabilmek için bir Interface sınıfı oluşturduk.

IClickListener.java

package com.mobilhanem.realmdatabaseapp.interfaces;

import android.view.View;

public interface IClickListener {

    void onMenuClick(View view, int position);
}

Adapter sınıfımızda kullanacağımız görsel kısmı oluşturan layout yapısı aşağıdadır

recylerview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        card_view:cardCornerRadius="10dp"
        card_view:cardElevation="5dp"
        card_view:cardUseCompatPadding="true">

        <LinearLayout
            android:id="@+id/topLayout"
            android:layout_margin="10dp"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">


            <LinearLayout
                android:orientation="horizontal"
                android:weightSum="3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center_vertical"
                    android:text="Ad: " />

                <TextView
                    android:id="@+id/personName"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center_vertical"
                    android:text="Address" />

                <TextView
                    android:id="@+id/textViewOptions"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="right"
                    android:text="&#8942;"
                    android:textAppearance="?android:textAppearanceLarge" />

            </LinearLayout>

            <LinearLayout
                android:orientation="horizontal"
                android:weightSum="3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center_vertical"
                    android:text="Soyad: " />

                <TextView
                    android:id="@+id/personSurname"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center_vertical"
                    android:text="Address" />


            </LinearLayout>


            <LinearLayout
                android:orientation="horizontal"
                android:weightSum="3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center_vertical"
                    android:text="Yaş: " />

                <TextView
                    android:id="@+id/personAge"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center_vertical"
                    android:text="Address" />


            </LinearLayout>

            <LinearLayout
                android:orientation="horizontal"
                android:weightSum="3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center_vertical"
                    android:text="Bölüm: " />

                <TextView
                    android:id="@+id/personDepartment"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center_vertical"
                    android:text="Address" />


            </LinearLayout>


        </LinearLayout>


    </android.support.v7.widget.CardView>


</RelativeLayout>

RecylerView bileşenimizi doldurmak için oluşturduğumuz adapter sınıfımızda aşağıdadır. RecylerView ile ilgili ayrıntılı bir anlatım burada yapmayacağım diğer derslerimde yeteri kadar bu konulara değindim. Tekrardan incelemek isteyenler bu dersimize bakabilirsiniz.

CustomAdapter.java

package com.mobilhanem.realmdatabaseapp.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.mobilhanem.realmdatabaseapp.R;
import com.mobilhanem.realmdatabaseapp.interfaces.IClickListener;
import com.mobilhanem.realmdatabaseapp.model.PersonTable;

import java.util.List;

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder>  {

    private Context context;
    private List<PersonTable> personList;
    private IClickListener clickListener;
    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView personName, personSurname, personDepartment, personAge, personOptionMenu;

        public MyViewHolder(View view) {
            super(view);
            personName = (TextView) view.findViewById(R.id.personName);
            personSurname = (TextView) view.findViewById(R.id.personSurname);
            personDepartment = (TextView) view.findViewById(R.id.personDepartment);
            personAge = (TextView) view.findViewById(R.id.personAge);
            personOptionMenu = (TextView)view.findViewById(R.id.textViewOptions);

            personOptionMenu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    clickListener.onMenuClick(v,getAdapterPosition());
                }
            });

        }
    }

    public CustomAdapter(Context mContext, List<PersonTable> personList, IClickListener clickListener) {
        this.context = mContext;
        this.personList = personList;
        this.clickListener = clickListener;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recylerview_item, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        PersonTable personTable = personList.get(position);
        holder.personName.setText(personTable.getName());
        holder.personSurname.setText(personTable.getSurname());
        holder.personDepartment.setText(personTable.getDepartment());
        holder.personAge.setText(String.valueOf(personTable.getAge()));

    }

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

Görsel kısmında ise , kullanıcı ekleme yapacağı için EditText ler ve eklenen kullanıcıların gösterilebilmesi içinde RecylerView tanımladık.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.mobilhanem.realmdatabaseapp.MainActivity">

    <LinearLayout
        android:id="@+id/topLayout"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/personNameEdit"
            android:hint="Adınızı giriniz.."
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/personSurnameEdit"
            android:hint="Soyadınızı giriniz.."
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/personDepartmentEdit"
            android:hint="Bölümünüzü giriniz.."
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/personAgeEdit"
            android:hint="Yaşınızı giriniz.."
            android:inputType="number"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:gravity="center_horizontal"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">


            <Button
                android:id="@+id/addBttn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Kaydet"
                android:onClick="addPerson"
                />

            <Button
                android:id="@+id/dismissBttn"
                android:visibility="gone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Vazgeç"
                android:onClick="dissmisChange"
                />

        </LinearLayout>



    </LinearLayout>


    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/topLayout"
        android:scrollbars="vertical" />


</RelativeLayout>

Şimdi MainActivity sınıfımızı inceleyelim;

MainActivity.java

package com.mobilhanem.realmdatabaseapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupMenu;
import android.widget.Toast;

import com.mobilhanem.realmdatabaseapp.adapter.CustomAdapter;
import com.mobilhanem.realmdatabaseapp.interfaces.IClickListener;
import com.mobilhanem.realmdatabaseapp.model.PersonTable;

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

import io.realm.Realm;
import io.realm.RealmResults;

public class MainActivity extends AppCompatActivity implements IClickListener {

    private Realm realm;
    private RecyclerView recyclerView;
    private EditText userNameEditText, userSurnameEditText, userAgeEditText, userDepartmentEditText;
    private Button addPersonButton, dismissButton;
    private CustomAdapter customAdapter;
    private List<PersonTable> personTables = new ArrayList<>();
    private int pos;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        realm = Realm.getDefaultInstance();

        Init();

        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        customAdapter = new CustomAdapter(getApplicationContext(),personTables,MainActivity.this);
        recyclerView.setAdapter(customAdapter);

        refreshList();

    }

    private void Init() {
        userNameEditText = (EditText)findViewById(R.id.personNameEdit);
        userSurnameEditText = (EditText)findViewById(R.id.personSurnameEdit);
        userDepartmentEditText = (EditText)findViewById(R.id.personDepartmentEdit);
        userAgeEditText = (EditText)findViewById(R.id.personAgeEdit);
        addPersonButton = (Button)findViewById(R.id.addBttn);
        recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        dismissButton = (Button)findViewById(R.id.dismissBttn);
    }

    public void addPerson(View view) {

        if(addPersonButton.getText().toString().equalsIgnoreCase("KAYDET")){


            if(checkFields()){

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

                        Number maxId = bgRealm.where(PersonTable.class).max("id");
                        int nextId = (maxId == null) ? 1 : maxId.intValue() + 1;
                        PersonTable personTable = bgRealm.createObject(PersonTable.class,nextId);
                        personTable.setName(userNameEditText.getText().toString());
                        personTable.setSurname(userSurnameEditText.getText().toString());
                        personTable.setDepartment(userDepartmentEditText.getText().toString());
                        personTable.setAge(Integer.parseInt(userAgeEditText.getText().toString()));

                    }
                }, new Realm.Transaction.OnSuccess() {
                    @Override
                    public void onSuccess() {
                        Toast.makeText(MainActivity.this, "Kayıt başarılı bir şekilde eklendi.", Toast.LENGTH_SHORT).show();
                        refreshList();
                        clearAllFields();
                    }
                }, new Realm.Transaction.OnError() {
                    @Override
                    public void onError(Throwable error) {
                        Toast.makeText(MainActivity.this, ""+error.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });


            }else{
                Toast.makeText(MainActivity.this, "Gerekli alanları giriniz!", Toast.LENGTH_SHORT).show();
            }


        }else{

            if(checkFields()){

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

                        RealmResults<PersonTable> realmResults = Realm.getDefaultInstance().where(PersonTable.class).findAll();
                        final PersonTable updateTable = realmResults.get(pos);
                        updateTable.setName(userNameEditText.getText().toString());
                        updateTable.setSurname(userSurnameEditText.getText().toString());
                        updateTable.setDepartment(userDepartmentEditText.getText().toString());
                        updateTable.setAge(Integer.parseInt(userAgeEditText.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();
                        clearAllFields();
                        addPersonButton.setText("Kaydet");
                        dismissButton.setVisibility(View.GONE);
                    }
                }, new Realm.Transaction.OnError() {
                    @Override
                    public void onError(Throwable error) {
                        Toast.makeText(MainActivity.this, ""+error.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });


            }


        }



    }

    private void clearAllFields() {

        userNameEditText.setText("");
        userSurnameEditText.setText("");
        userDepartmentEditText.setText("");
        userAgeEditText.setText("");
        userNameEditText.setText("");
        userNameEditText.setText("");
        userNameEditText.setText("");
    }

    private void refreshList() {

        RealmResults<PersonTable> realmResults = realm.where(PersonTable.class).findAll();
        personTables.clear();
        for(PersonTable personTable: realmResults){
            personTables.add(personTable);
        }
        customAdapter.notifyDataSetChanged();

    }

    private boolean checkFields() {

        if(userNameEditText.getText().toString().length()>0 && userSurnameEditText.getText().toString().length()>0 &&
                userAgeEditText.getText().toString().length()>0  && userDepartmentEditText.getText().toString().length()>0 ){
            return true;
        }
        return false;
    }

    private void fillAllFields(String name,String surname, String department, String age){

        userNameEditText.setText(name);
        userSurnameEditText.setText(surname);
        userDepartmentEditText.setText(department);
        userAgeEditText.setText(age);

    }

    @Override
    public void onMenuClick(View view, final int position) {
        PopupMenu popup = new PopupMenu(getApplicationContext(), view);
        popup.inflate(R.menu.menu_item);
        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.editPersonItem:
                        updatePerson(position);
                        break;
                    case R.id.deletePersonItem:
                        deletePerson(position);
                        break;
                }
                return false;
            }
        });
        popup.show();
    }

    private void updatePerson(int position) {

        RealmResults<PersonTable> realmResults = realm.where(PersonTable.class).findAll();
        final PersonTable updateTable = realmResults.get(position);
        fillAllFields(updateTable.getName(),updateTable.getSurname(),updateTable.getDepartment(),String.valueOf(updateTable.getAge()));
        addPersonButton.setText("Güncelle");
        dismissButton.setVisibility(View.VISIBLE);
        this.pos = position;

    }

    private void deletePerson(final int position) {
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                PersonTable personTable = personTables.get(position);
                personTable.deleteFromRealm();
                refreshList();
            }
        });
    }

    public void dissmisChange(View view) {

        clearAllFields();
        addPersonButton.setText("Kaydet");
        dismissButton.setVisibility(View.GONE);
    }
}

Yukarıdaki kodları ayırarak anlatmaya başlayalım; öncelikle kullanıcı Realm Veritabanına kişi eklemek isterse aşağıdaki kod parçacığı çalışacaktır. realm objesinin executeTransactionAsync methodu ile asekron bir işlem başlatmış oluyoruz. execute methodu içinde neler yapacağımızı yazıyoruz. Realm de veritabanı işlemlerinde auto increment bir yapı yoktur o yüzden kendi auto incerement yapımızı oluşturmak için aşağıdaki gibi bir yapı oluşturduk. Yarattığımız PersonTable modellerinede EditText lerde yer alan değerleri set ettik. Eğer kullanıcı ekleme işlemi başarılı olursa OnSuccess methodu tetiklenecektir. Eğer ekleme işleminde herhangi bir hata varsa da onError methodu tetiklenecektir.

Realm Veritabanı Ekleme İşlemi

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

                        Number maxId = bgRealm.where(PersonTable.class).max("id");
                        int nextId = (maxId == null) ? 1 : maxId.intValue() + 1;
                        PersonTable personTable = bgRealm.createObject(PersonTable.class,nextId);
                        personTable.setName(userNameEditText.getText().toString());
                        personTable.setSurname(userSurnameEditText.getText().toString());
                        personTable.setDepartment(userDepartmentEditText.getText().toString());
                        personTable.setAge(Integer.parseInt(userAgeEditText.getText().toString()));

                    }
                }, new Realm.Transaction.OnSuccess() {
                    @Override
                    public void onSuccess() {
                        Toast.makeText(MainActivity.this, "Kayıt başarılı bir şekilde eklendi.", Toast.LENGTH_SHORT).show();
                        refreshList();
                        clearAllFields();
                    }
                }, new Realm.Transaction.OnError() {
                    @Override
                    public void onError(Throwable error) {
                        Toast.makeText(MainActivity.this, ""+error.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });

Aşağıdaki kod parçasını incelediğimizde ise; yine asekron işlem başlatıyoruz. execute methodunda Realm.getDefaultInstance().where(PersonTable.class).findAll() bu kod ile kayıtlı olan bütün kullanıcıları çekiyoruz ve position değerine göre de istenilen kullanıcının kayıtlı olan değerlerini değiştirebiliyoruz.

Realm Veritabanı Güncelleme İşlemi

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

                        RealmResults<PersonTable> realmResults = Realm.getDefaultInstance().where(PersonTable.class).findAll();
                        final PersonTable updateTable = realmResults.get(pos);
                        updateTable.setName(userNameEditText.getText().toString());
                        updateTable.setSurname(userSurnameEditText.getText().toString());
                        updateTable.setDepartment(userDepartmentEditText.getText().toString());
                        updateTable.setAge(Integer.parseInt(userAgeEditText.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();
                        clearAllFields();
                        addPersonButton.setText("Kaydet");
                        dismissButton.setVisibility(View.GONE);
                    }
                }, new Realm.Transaction.OnError() {
                    @Override
                    public void onError(Throwable error) {
                        Toast.makeText(MainActivity.this, ""+error.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });

Realm Veritabanından kayıt silmek içinde aşağıdaki gibi bir yapı oluşturuyoruz. Listelenen veriler içinden silmek istediğimizin position değerini listeye verdiğimizde bize PersonTable tipinde bir model dönüyor daha sonra da dönen modeli deleteFromRealm methodu ile siliyoruz.

Realm Veritabanı Silme İşlemi

realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                PersonTable personTable = personTables.get(position);
                personTable.deleteFromRealm();
                refreshList();
            }
        });

Veritabanında bulunan bütün kayıtları silmek istersek ; yine bütün kayıtları çekiyoruz ve çekilen kayıtlar üzerinden deleteAllFromRealm methodunu tetikliyoruz.

 final RealmResults<PersonTable> realmResults = realm.where(PersonTable.class).findAll();

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

               realmResults.deleteAllFromRealm();
           }
       });

Uygulamamızda kayıtlı olan ve yaşı 27 olan kullanıcıyı bulmak istersek aşağıdaki sorgu yapısını oluşturmalıyız.

PersonTable person = Realm.getDefaultInstance().where(PersonTable.class).equalTo("age",27).findFirst();

Uygulamamızda kayıtlı olan kullanıcıları yaşa göre azalan sırada sıralamak istersek aşağıdaki sorgu yapısını oluşturmalıyız.

RealmResults<PersonTable> realmResults = Realm.getDefaultInstance().where(PersonTable.class).sort("age", Sort.DESCENDING).findAll();

Uygulamayı ilk çalıştırdığımızda karşımıza gelen ekran:

Herhangi bir kayıt ekledikten sonra oluşan ekran görüntümüz:

Eklenen herhangi bir kaydı güncellemek istediğimizde :

         

Kaynak kodu indirip, çalıştırmanızı öneririm ayrıca kodları temel olarak anlatmaya çalıştım umarım faydalı olmuştur. Realm Veritabanı kullanımının gördüğünüz gibi bir çok esnekliği ve kolaylığı mevcut. Bu dersimizde veritabanına kayıt ekleme, kayıt silme ve kayıt güncelleme gibi işlemleri gerçekleştirdik.

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

Mobilhanem.com üzerinden anlattığımız android 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..

8

Alper Beyler

Yüksek Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği
Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği (4/3.30) (2010-2014)
Lisans : Viyana Teknik Üniversitesi / Bilgisayar Bilimleri (2013)

4 Yorum

    • Res in altına menu klasörü ekleyip onun içine de “menu_item.xml” layout u oluşturman lazım.

      menu_item.xml içeriği;

  • Merhaba. Ben uygulamayı yazdım. Kayıt ekleme ve güncelleme işlemleri çalışıyor. Fakat Kaydı silmek istediğim zaman hata alıyorum.
    Hata mesajı:
    ” Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created”

    Çözüm yolu hakkında yardımcı olabilir misiniz acaba?

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?