Room Kütüphanesinin Kullanımı

Yazılım projelerinin  dinamik olduğu durumlarda, yazılımcılar,  verilerini veritabanlarında  barındırır.  Yazılım dünyasında, çok çeşitli veritabanı  sistemleri bulunmaktadır. Biz Android yazılımcıları da,  şuana kadar  Content Provider aracılığı ile SQLite veritabanını kullanırdık. Google I/O 2017 konferansında,  Google,  akıcı veritabanı erişimi sağlayan Room kütüphanesini  duyurmasıyla birlikte veritabanı oluşturma da yeni bir yola girmiş bulunmaktayız.

Bu makalemde ise  Room nedir,Room’un avantajları ve Room kütüphanesinin kullanımını örnekleyen bir anlatım yapacağım.

Room Nedir?

Room, Android uygulamalarınızda veritabanları oluşturmanın yeni bir yoludur. Room, uygulamalarınızda veri depolamak için daha önce yazmak zorunda kalmış olduğunuz çok sayıda kalıp kodu ortadan kaldırır. Room, Java sınıfları ve SQLite arasındaki ORM’dir.

SQLite veritabanında sql çalıştırmak için kullanmanız gereken Cursors ve Loaders sınıfları bulunmaktadır. Fakat Room ile çalışacağınız zaman bu sınıfları kullanmanız gerekmemektedir.

Diğer bir yandan Room, tam teşekküllü bir ORM değildir. Örneğin, Room kullandığınızda, diğer ORM çözümleri gibi nesnelerin karmaşık iç içe yerleştirilmesine izin veremezsiniz.

 

Örnek Uygulama

Room’ un nasıl çalıştığını daha iyi anlamak için bir örnek yapalım. Yapacağımız uygulama, kullanıcıların ad,  soyad ve yaş gibi bilgilerini veritabanına kayıt edecek.

  1. Android Studio ide’sinde yeni bir proje oluşturalım.
  2. Projenizin ana dizininde bulunan  build.gradle dosyasına aşağıda kodu ekleyelim.
    ext {
    buildToolsVersion = "25.0.2"
    supportLibVersion = "25.3.1"
    archRoomVersion = "1.0.0-alpha1"
    }
    allprojects {
    repositories {
    jcenter()
    maven { url 'https://maven.google.com' }
    }
    }
  3. Oluşturduğum projemin app dizinin altındaki build.gradle dosyasını açıyoruz. Dependencies kod bloklarının arasına aşağıdaki kodları yerleştirerek  Room kütüphanesini yüklüyoruz.
    compile 'android.arch.persistence.room:runtime:' + 
    rootProject.archRoomVersion;
    annotationProcessor 'android.arch.persistence.room:compiler:' + 
    rootProject.archRoomVersion;
  4. Şimdi, ilk önce entity ile User adlı bir tablomuzu tanımlayalım.  Tablonuzdaki  otomatik olarak değerler üretme özelliğine sahip olacak id alanını, primary key olarak ilan etmeniz gerekir. Bu yüzden uid değişkenini, primary key olarak tanımladık. autoGenerate değerinide true yaptık. Böylelikle  Room, tanımlanmış niteliklere sahip bir User tablosu oluşturacaktır.
    @Entity(tableName = "user")
    public class User {
    @PrimaryKey(autoGenerate = true)
    private int uid;
    @ColumnInfo(name = "first_name")
    private String firstName;
    @ColumnInfo(name = "last_name")
    private String lastName;
    @ColumnInfo(name = "age")
    private int age;
    public int getUid() {
    return uid;
    }
    public void setUid(int uid) {
    this.uid = uid;
    }
    public String getFirstName() {
    return firstName;
    }
    public void setFirstName(String firstName) {
    this.firstName = firstName;
    }
    public String getLastName() {
    return lastName;
    }
    public void setLastName(String lastName) {
    this.lastName = lastName;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    }
  5. UserDao adında, veri erişimini sağlayacak interface sınıfı oluşturun. Sınıfı @Dao ek açıklama ile açıklayın. Böylelikle Room kütüphanesi veritabanı ile ilgili metodları oluşturacakdır.Buraya farklı açıklamalar, @Query, @Delete, @Insert, @Update gibi ek açıklamalar kullanabilirsiniz. @Query açıklaması, veritabanında okuma işlemini gerçekleştirmek için kullanılır.
    @Dao
    public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();
    @Query("SELECT * FROM user where first_name LIKE  :firstName AND last_name LIKE :lastName")
    User findByName(String firstName, String lastName);
    @Query("SELECT COUNT(*) from user")
    int countUsers();
    @Insert
    void insertAll(User... users);
    @Delete
    void delete(User user);
    }
  6. AppDatabase adında bir sınıf oluşturdum. RoomDatabase sınıfını,  AppDatabase ‘na extends yaptım. AppDatabase  sınıfında entity’lerin listesini ve veritabanı sürümünü tanımlayacağız.  Sınıfa @Database ek açıklama ile ekledim.Koda bakalım.
    @Database(entities = {User.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
    private static AppDatabase INSTANCE;
    public abstract UserDao userDao();
    public static AppDatabase getAppDatabase(Context context) {
    if (INSTANCE == null) {
    INSTANCE =
    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "user-database")
    // allow queries on the main thread.
    // Don't do this on a real app! See PersistenceBasicSample for an example.
    .allowMainThreadQueries()
    .build();
    }
    return INSTANCE;
    }
    public static void destroyInstance() {
    INSTANCE = null;
    }
    }

    Artık veritabanının User tablosuna kullanıcı ekleyebilirsiniz.

    private static User addUser(final AppDatabase db, User user) {
    db.userDao().insertAll(user);
    return user;
    }
    private static void populateWithTestData(AppDatabase db) {
    User user = new User();
    user.setFirstName("Ajay");
    user.setLastName("Saini");
    user.setAge(25);
    addUser(db, user);
    }

     

Genel olarak özetlemek gerekirse, Room, uygulamalarınızda veri depolamak için daha önce yazmak zorunda kalmış olduğunuz çok sayıda kalıp kodu ortadan kaldırır. Böylelikle bu yapıyı kullanarak karmaşık ve zorlayıcı veritabanlarını daha kolay uygulayabilir hale gelmiş olduk.

Diğer makalelerime de Smality Mobile Software adındaki yazılım ekibimin sitesinden ulaşabilirsiniz.

http://smality.com/grid-blog/

 

Kaynak

  1. https://medium.com/@ajaysaini.official/building-database-with-room-persistence-library-ecf7d0b8f3e9
  2. https://riggaroo.co.za/android-architecture-components-looking-room-livedata-part-1/
Kategori Genel
Etiketler