ActiveAndroid ile ORM

Android kullanırken, Java EE’de olupda Android’tede olsa dediğim özelliklerden bir diğeri de ORM (Object Relational Mapping). Andorid için bu işi yapan kütüphaneler mevcut. ORMLite, greenDAO ve ActiveAndroid bunlardan bir kaçı. Ben denediklerim içinde en çok ActiveAndroid’i beğendiğimden ve kendime en yakın onu bulduğum. Bu sebepten bu yazıda ActiveAndroid kullanarak, Andorid uygulamalarınıza nasıl ORM’i entegre edeceğinizi anlatmaya çalışacağım.

Hazırlık

Öncelikle şunu belirteyim, ActiveAndroid kaynak kodları güzel yazılmış ve güzel bir proje yapısında bulunmakta. Maven kullanılarak yönetilmiş. Fakat ne yazık ki ben hiçbir maven kod deposunda JAR haline rastlayamadım. Bu sebepten Github üzerinden kodu indirip kendinizin derlemesi gerekiyor. Bunu yaptıktan sonra ister maven projesi olarak kullanın ister porjenizin libs klasörüne ekleyin bu size kalmış.

Kütüphane

  • Projeyi bu linke tıklayarak ZIP formatında indirebilirsiniz.
  • Projenizi ZIP dosyasından çıkarıp, pom.xml dosyasının olduğu dizine geliyoruz. Burada “mvn clean install” komutunu çalıştırdığınızda, oluşan JAR dosyası hem lokal maven deposuna yüklenecek hemde target klasörü altından erişilebilir olacak.
  • “mvn clean install” komutunun düzgün çalışabilmesi için sistem değişkenlerinizde ANDORID_HOME değişkeninin tanımlı olması gerekiyor.

Proje

Ben örneğimde basit bir Andorid uygulaması kullanacağım. Projeyi oluşturduktan sonra yukarıdaki adımlarla oluşturduğumuz JAR dosyasını libs klasörünün altına atıp kullanacağız.active_android_orm

Eclipse üzerinden Android Application Project yaratıyoruz. Yaratırken aşağıdaki değerleri kullanıyorum.

  • Application Name: ORMTutorial
  • Project Name:   ORMTutorial
  • Package Name:  com.bahadirakin.orm
  • Minimum Required SDK: API 8
  • Target SDK: API 18
  • Compile With: API 18
  • Theme: None

Daha sonra proje oluştuktan sonra oluşturduğumuz activeandroid-<version>.jar  dosyasını libs klasörünün altına kopyalıyoruz. Böylelikle projemiz hazır hale geliyor. Burdan sorna ayarlarımızı yapıp, nesnlerimizi veribanına kaydetmeye başlayacağız. Fakat tek bir noktaya odaklanmak için arayüzle ilgili bişeyler yapmayacağım. Sadece Toast kullanarak verileri ekrana yazdıracağım.

Ayarların Yapılması

Aslında lokalde bir veritabanı oluşturulup o veritabanı kullanılacağından yapılacak çok fazla ayarımız yok. Sadece yapmamız gerekenler şu şekilde;

  • Uygulama başlatıldığında veritabanı bağlantılarını açmak.
  • Uygulama sonlanırken ise bu bağlantıları kapatmak.
  • Veritabanı adının ve versiyonunun belirlenmesi.

Uygulama başlarken ve kapanırken işlemler yapacağımızdan kendi Android Application sınıfımızı yaratmamız gerekiyor. Bunun için öncelikle sınıfımızı oluşturacağız. Ardından AndoridManifest.xml dosyası içerisinde Application sınıfımızı göstereceğiz.

CustomApplication.java

Böylelikle kendi Application sınıfımızı yaratmış olduk. Burdan sonra bu sınıfımızı AndoridManifest.xml dosyası içerisinde belirtmeliyiz ki uygulamamız bizim sınıfımız üzerinden başlasın.

AndroidManifest.xml

CustomApplication sınıfımızı verirken aynı zamanda veritabanı adını ve veritabanı versiyonu değerlerinide belirttik. Bu iki değer isteğe bağlı ayarlanıyor olsa da ben veritabanı adının verilmesinden yanayım. Versiyon ise ana verilerinizin kayıtlı olduğu SQL dosyalarını içe aktarmak için kullanılıyor. Örneğin kullanıcı listenizin uygulama yüklendiğinde ayarlı olmasını istiyorsanız bir SQL dosyası kullanarak yüklenmesini sağlayabilirsiniz. Bu biraz daha ayrıntı bir konu olduğundan daha fazla değinmeyeceğim ama merak ediyorsanız bu tutorial‘ı inceleyebilirsiniz.

Modeller ve CRUD

Eğer daha önce Hibernate gibi bir araçla çalıştıysanız modellerin oluşturulmasına biraz aşinasınızdır. Fakat android kullandığımızdan ve runtime sırasında PROXY’lemek maliyetli olacağından alıştığımızın biraz dışına çıkıyoruz. Sadece Annotation ile modellerimizi işaretlemenin yanında bir de Model sınıfından türetmemiz gerekiyor.

Model sınıfı aslında nesnemizi aynı zamanda kendi DAO(Data Access Object)’su haline getiriyor. Bu benim içime sinmese de hemen hemen tüm Android tabanlı ORM araçları bu şekilde çalışıyor. Basit olması açısından güzel fakat OOP prensipleri açısından felaket gibi görünsede kullanmaya devam ediyorum.

Bir diğer içime sinmeyen kısım ise ID alanlarının otomatik olarak gelmesi. Yani Model sınıfından türettiğinizde otomatik olarak size AutoIncrement bir ID atanmış oluyor. Bu kontrolü yitirmekte hoşuma gitmese de hemen hemen tüm Entity’lerinde AutoIncrement id kullandığım için çok umursamıyorum.

Şimdi örnek bir Book ve Author sınıfı yaratalım. Çoğu örnekte kullanılsa da biz biraz daha basit halini kullanacağız. Her kitabın bir yazarı olduğunu varsayıp, 1-n’lik bir ilişki gibi yaklaşacağız.

Book.java

Author.java

Burada ilişkinin nasıl sağlandığına dikkat etmenizi istiyorum. Andorid içerisinde bir PROXY mekanizması kurulmadığından LAZY Loading gibi özellikler kullanılamıyor. Bu sebepten doğruca “Criteria” yazılmış gibi davranılıyor.

Create

Bunları yaptıktan sonra basit bir create yapılmak istenildiğinde uygulamanın başında aşağıdaki kod parçası kullanılabilir. Ben bu kod parçasını MainActivity’nin başında kullanacağım.

MainActivity.java

Bu şekilde uygulamayı çalıştırdığımızda ekranda “Author saved….Id: 1 ” yazısını yazması gerekiyor. ID’lerin otomatik olarak eklendiğini ve AutoIncrement olduklarını daha önce belirtmiştim.

Read

Şimdi kodumuzu tekrar çalıştırıp bir read işlemi yapalım. Hatta bu sefer okuduğumu Author değerini bir Book nesnesine atayıp onu veritabanına kayıt edelim.

MainActivity.java

Bu sefer kodumuzu çalıştırdığımızda “Book saved…Id: 1 And Author: Bahadır AKIN” mesajı gözükecek.

Update

Şimdi ise son kayıt ettiğimiz 1 numaralı Book sınıfını alalım ve kitabın ismini Test Book 2 olarak değiştirelim. Sonra da veritabanını güncelleyelim.

MainActivity.java

Kodumuzu bu şekilde çalıştırdığımızda da bu sefer “Book updated…. Id: 1 and Name: Test Book 2 ” yazısını göreceğiz.

Delete

Son olarak Delete işlemini yapıp CRUD işlemlerini bitiyoruz. Delete işlemi sırasında Book nesnsini sileceğiz. Eğer Book nesnesini değilde Author nesnesini silmeye kalkarsak Exception ile karşılaşırız.

 Sorgular

Çoğu ORM aracı, ister Java ister Android aracı, sorgular için kendi yapılarını sunmuşlardı. JPA için bu JQL olmuştur, Hibernate için Criteria API, Example yapıları ya da HQL olmuştur. ActiveAndroid’te bu araçların izinden giderek kendi sorgu methodunu geliştirmiş. Burada her büyük sorgu için kendi sınıfından oluşturuyoruz.

SELECT

Select sorguları için Select nesnesi kullanılıyor. Burdan sonra Criteria API gibi sorgunuzu oluşturmaya başlıyorsunuz.

Burada iki select sorgusu örneği var. İlk sorgu tüm Author nesnelerini getirirken ikinci sorgu sadece adı “Bahadır AKIN” olan nesneleri getirmekte. Bu sorguları istediğiniz gibi uzatabilirsiniz. Tamamen size kalmış.

Delete

Yapabileceğiniz diğer büyük sorgulama işlemi DELETE. Bu da Select kısmında olduğu gibi Delete nesnesi üzerinden yapılıyor.

 Son

Her ne kadar Model ve DAO’ların birleşmiş olması ilgimi çekmese de ve ID’leri otomatik kendi üretiyorda olsa gayet kullanışlı ve basit şekilde ORM işlevini görüyor.

Kaynaklar