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