Pre-Populate Room Database
Giriş
Selamlar 👋, uygulama geliştirme süreçlerinde hiç oluşturduğunuz bir data class’ı sadece okuma yapabileceğiniz şekilde, bir defa ya mahsus database’e kaydetmeniz gerekti mi❓ Ne demek istiyorum❓ hiç elinizde kodunuzu yazarken oluşturduğunuz yüzlerce elemanı olan ama hepsini o anda kullanmanız gerekmeyen bir veri setiniz oldu mu❓ Bu yüzlerce, binlerce hafızada tutulmuş veriler, sizce de hafıza yönetimi ve bellek sızdırması gibi konular için tehlikeli değil mi❓ Oluşturduğunuz bu verileri başka activityler ve başka fragmentler için taşıyacak olduğunuzda işlem yükü gereksiz artmıyor mu❓ Peki bunu nasıl çözebiliriz❓ Bu yazımda sizlere bunun çözüm yöntemlerinden birisinden bahsedeceğim, gelin başlayalım🙃.
Prepopulate Nedir❓
“Prepopulate room database”, bir Room veritabanına önceden belirlenmiş verileri eklemek anlamına gelir. Bu, uygulamanızı başlattığınızda veya veritabanını ilk kez kullanmaya başladığınızda, veritabanında varsayılan veya hazır verilere sahip olmanızı sağlar.
Prepopulate işlemi, uygulama başlatıldığında veya veritabanının oluşturulduğu ilk anda gerçekleştirilir. Bu, veritabanı tablolarını ve ilişkilerini oluştururken, tablolara önceden tanımlanmış verilerin eklenmesini sağlar. Böylece, kullanıcılar uygulamayı açtıklarında veya veritabanını kullandıklarında, başlangıçta belirlenmiş verilere erişebilirler.
Prepopulate işlemi için genellikle bir dizi veri veya JSON dosyası kullanılır. Bu dosyalar, veritabanının modele uygun olarak doldurulmasını sağlamak için önceden tanımlanmış verileri içerir. Bu verileri, Room DAO’ları ve veritabanı işlemleri kullanarak veritabanına ekleyebilirsiniz.
Örneğin, bir ülkeler ve bayrakları gibi uygulama yaptığımızda, Tüm ülke ve bayraklarının kaydını oluşturduğumuz veri tabanını uygulama açılırken yükleyeceğimiz için hızlı bir şekilde kullanıcıya sunulabilir.
Prepopulate işlemi, kullanıcı deneyimini iyileştirebilir ve uygulamanızın daha kullanılabilir hale gelmesini sağlar. Ayrıca, önceden doldurulmuş verileri kullanarak uygulama testlerini ve geliştirme sürecini kolaylaştırabilirsiniz.
Nasıl Kullanılır❓
Room’un kullanımını gösterebilmek için basit bir örnek veritabanı senaryosu oluşturalım. Varsayalım ki bir film veritabanı uygulaması yapmak istiyoruz ve filmlerin adını, yönetmenini ve yayınlanma yılını kaydetmek istiyoruz.
1. Adım: Veritabanı Nesnesini Oluşturma
İlk olarak, veritabanı nesnesini oluşturmanız gerekiyor. Bu işlem için Room Database sınıfını genişleten bir sınıf oluşturmanız gerekmektedir. Örnek olarak, "FilmVeritabani" adlı bir sınıf oluşturalım:
Yukarıdaki örnekte, createFromAsset yöntemini kullanarak prepopulate için kullanılacak veritabanı dosyasının yolunu belirtiyoruz. Veritabanı dosyası assets klasörü altında yer almalıdır.
2. Adım: Varlık Sınıfını Oluşturma
Veritabanınızdaki her bir öğe için bir varlık sınıfı oluşturmanız gerekmektedir. Örnek olarak, “Film” adlı bir varlık sınıfı oluşturalım:
Film sınıfımız sayesinde tablomuzun içeriğini göstermiş olduk.
3. Adım: Erişim Noktası Nesnesini Oluşturma
Veritabanına erişim için DAO (Data Access Object) sınıfını oluşturmanız gerekmektedir. Bu sınıf, veritabanı sorgularını tanımlayacak yöntemleri içerir. Örnek olarak, “FilmDao” adında bir DAO sınıfı oluşturalım:
Insert annotation'ını kullanarak bir filmi veritabanına ekleme işlemini, Query annotation'ını kullanarak da tüm filmleri alma işlemini tanımladık.
4. Adım: Veritabanı Nesnesini Kullanma
Son adımda, veritabanı nesnesini kullanabilirsiniz. Örnek olarak, MainActivity sınıfında veritabanı işlemlerini gerçekleştirelim:
Yukarıdaki örnekte, FilmVeritabani.getInstance() yöntemini kullanarak veritabanı nesnesini alıyoruz. Ardından, veritabanı işlemlerini gerçekleştiriyoruz. Bu örnekte, filmekle() yöntemiyle yeni bir film ekliyoruz ve tumFilmleriAl() yöntemiyle tüm filmleri alıyoruz.
Prepopulate özelliği sayesinde, createFromAsset() yöntemi aracılığıyla uygulama başlatıldığında veritabanına önceden tanımlanmış verileri doldurmuş olacaksınız.
Bu anlattıklarıma ilave olarak bir de migration özelliğinden bahsetmek istiyorum.
Migration işlemi genellikle iki senaryoda kullanılır:
- Veritabanı sürümünü yükseltmek: Veritabanı şemasında yapısal değişiklikler yaparak yeni bir sürüm oluşturursunuz. Örneğin, bir sütun eklemek veya mevcut bir sütunu silmek gibi değişiklikler yapabilirsiniz.
- Veritabanı şemasını değiştirmek: Veritabanı yapısını tamamen değiştirmek istediğinizde kullanılır. Bu durumda, mevcut veritabanını tamamen kaldırıp yeni bir veritabanı oluşturursunuz.
Migration işlemini gerçekleştirmek için aşağıdaki adımları takip edebilirsiniz:
1. Veritabanı sınıfına migration stratejisini belirtin:
- Veritabanı sınıfında Database annotation'ında version parametresini güncelleyerek yeni sürüm numarasını belirtin.
- Ayrıca fallbackToDestructiveMigration() veya addMigrations() yöntemini kullanarak migration stratejisini belirtmelisiniz.
Yukarıdaki örnekte, fallbackToDestructiveMigration() yöntemini kullanarak, her sürüm güncellemesinde mevcut veritabanını tamamen silip yeniden oluşturmayı tercih ettik.
Alternatif olarak, addMigrations() yöntemini kullanarak daha karmaşık bir migration stratejisi belirleyebilirsiniz. Bu yöntemle, Migration sınıflarını tanımlayarak eski ve yeni veritabanı şemaları arasındaki farkları yönetebilirsiniz.
2. Migration sınıflarını tanımlayın:
Migration sınıfları, eski ve yeni veritabanı şemaları arasındaki değişiklikleri yönetir. Bu sınıflar, Migration() sınıfını genişleterek ve migrate() yöntemini uygulayarak oluşturulur.
Yukarıdaki örnekte, MIGRATION_1_2 ve MIGRATION_2_3 adında iki adet migration sınıfı tanımladık. Bu sınıfların migrate() yöntemlerinde eski veritabanı şemasından yeni şemaya uyumlu hale getirme işlemleri gerçekleştirilir.
Migration sınıflarını kendi ihtiyaçlarınıza göre özelleştirebilirsiniz. Örneğin, sütun eklemek veya silmek, veri dönüşümü yapmak gibi işlemleri bu sınıflar içerisinde gerçekleştirebilirsiniz.
Bu şekilde, Room veritabanında migration özelliğini kullanarak veritabanınızı sürüm güncellemelerine uyumlu hale getirebilirsiniz.
Sonuç
Uygulama geliştirme sürecinde benimde yaşadığım sorunlardan birisi kullanıcının devamlı olarak kullanması gereken ancak uygulamanın herhangi bir internet bağlantısı olmadan da çalışabileceği verileri, herhangi bir statik sınıf yardımı olmadan sağlıklı bir şekilde tutarak, uygulamanın içerisindeki tüm fragmentlarda kullanılmasıydı. Pre-populate bu sorun için uygun bir çözümü bizlere getiriyor. Henüz uygulama ilk kez açılırken kullanıcının local database’ine kayıt yaparak bundan sonraki tüm süreçte o verileri yeniden oluşturmadan, databaseden çekerek kullanmamız mümkün oldu.
Bu çalışma süresince ben çok şey öğrendim umarım sizlere de aynı şekilde katkısı bulunur. Sağlıcakla kalın kodla kalın👨💻🙋♂️.