Bu codelab, Android Kotlin Hakkında Temel Bilgiler kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla tamamlamanızı öneririz. Kursla ilgili tüm codelab'ler Android Kotlin Hakkında Temel Bilgiler codelab'leri açılış sayfasında listelenir.
Giriş
Çoğu uygulamada, kullanıcı uygulamayı kapattıktan sonra bile saklanması gereken veriler bulunur. Örneğin, uygulama bir oynatma listesini, oyun öğelerinin envanterini, gider ve gelir kayıtlarını, takımyıldızlar kataloğunu veya zaman içindeki uyku verilerini saklayabilir. Genellikle kalıcı verileri depolamak için bir veritabanı kullanırsınız.
Room, Android Jetpack'in bir parçası olan bir veritabanı kitaplığıdır. Room, veritabanı oluşturma ve yapılandırma işlemlerinin çoğunu halleder ve uygulamanızın normal işlev çağrılarını kullanarak veritabanıyla etkileşim kurmasını sağlar. Room, arka planda SQLite veritabanının üzerinde bir soyutlama katmanıdır. Room'ın terminolojisi ve daha karmaşık sorgular için sorgu söz dizimi, SQLite modelini takip eder.
Aşağıdaki resimde, Room veritabanının bu kursta önerilen genel mimariye nasıl uyduğu gösterilmektedir.

Bilmeniz gerekenler
Aşağıdaki konular hakkında bilgi sahibi olmanız gerekir:
- Android uygulaması için temel bir kullanıcı arayüzü (UI) oluşturma
- Etkinlikleri, parçaları ve görünümleri kullanma
- Parçalar arasında gezinme ve parçalar arasında veri aktarmak için Safe Args'ı (bir Gradle eklentisi) kullanma.
- Modeller, görünüm modeli fabrikaları ve
LiveDataile gözlemcileri. Bu Mimari Bileşenler konuları, bu kurstaki önceki bir codelab'de ele alınmıştır. - SQL veritabanları ve SQLite dili hakkında temel bilgiler. Hızlı bir genel bakış veya hatırlatma için SQLite Primer'ı inceleyin.
Neler öğreneceksiniz?
- Verileri kalıcı hale getirmek için
Roomveritabanı oluşturma ve veritabanıyla etkileşimde bulunma - Veritabanındaki bir tabloyu tanımlayan veri sınıfı oluşturma
- Kotlin işlevlerini SQL sorgularıyla eşlemek için veri erişim nesnesi (DAO) nasıl kullanılır?
- Veritabanınızın çalışıp çalışmadığını test etme
Yapacaklarınız
- Gece uyku verileri için arayüz içeren bir
Roomveritabanı oluşturun. - Veritabanını, sağlanan testleri kullanarak test edin.
Bu codelab'de, uyku kalitesini izleyen bir uygulamanın veritabanı bölümünü oluşturacaksınız. Uygulama, uyku verilerini zaman içinde saklamak için bir veritabanı kullanır.
Uygulama, aşağıdaki şekilde gösterildiği gibi parçalarla temsil edilen iki ekrana sahiptir.
Solda gösterilen ilk ekranda izlemeyi başlatma ve durdurma düğmeleri bulunur. Ekranda kullanıcının tüm uyku verileri gösterilir. Temizle düğmesi, uygulamanın kullanıcı için topladığı tüm verileri kalıcı olarak siler.
Sağda gösterilen ikinci ekranda uyku kalitesi derecesi seçilir. Uygulamada puan sayısal olarak gösterilir. Uygulama, geliştirme amacıyla hem yüz simgelerini hem de bunların sayısal karşılıklarını gösterir.
Kullanıcının akışı şu şekildedir:
- Kullanıcı uygulamayı açar ve uyku takibi ekranı gösterilir.
- Kullanıcı, Başlat düğmesine dokunur. Bu işlev, başlangıç zamanını kaydeder ve görüntüler. Başlat düğmesi devre dışı, Durdur düğmesi ise etkin olur.
- Kullanıcı, Durdur düğmesine dokunur. Bu işlem, bitiş zamanını kaydeder ve uyku kalitesi ekranını açar.
- Kullanıcı, uyku kalitesi simgesi seçer. Ekran kapanır ve takip ekranında uyku bitiş saati ile uyku kalitesi gösterilir. Durdur düğmesi devre dışı, Başlat düğmesi ise etkin olur. Uygulama başka bir geceye hazır.
- Veritabanında veri olduğunda Temizle düğmesi etkinleştirilir. Kullanıcı Temizle düğmesine dokunduğunda tüm verileri geri dönüşü olmayacak şekilde silinir. "Emin misiniz?" mesajı gösterilmez.
Bu uygulama, tam mimari bağlamında aşağıda gösterildiği gibi basitleştirilmiş bir mimari kullanır. Uygulama yalnızca aşağıdaki bileşenleri kullanır:
- Kullanıcı arayüzü denetleyicisi
- Modeli ve
LiveDatagörüntüleme - Room veritabanı
1. adım: Başlangıç uygulamasını indirip çalıştırın
- GitHub'dan TrackMySleepQuality-Starter uygulamasını indirin.
- Uygulamayı oluşturup çalıştırın. Uygulama,
SleepTrackerFragmentparçası için kullanıcı arayüzünü gösteriyor ancak veri göstermiyor. Düğmeler dokunmaya yanıt vermiyor.
2. adım: Başlangıç uygulamasını inceleyin
- Gradle dosyalarına göz atın:
- Proje Gradle dosyası
Proje düzeyindekibuild.gradledosyasında, kitaplık sürümlerini belirten değişkenlere dikkat edin. Başlangıç uygulamasında kullanılan sürümler birlikte ve bu uygulamayla iyi çalışır. Bu codelab'i tamamladığınızda Android Studio, bazı sürümleri güncellemenizi isteyebilir. Güncelleme yapmak veya uygulamadaki sürümleri kullanmaya devam etmek sizin tercihinizdir. "Garip" derleme hatalarıyla karşılaşırsanız nihai çözüm uygulamasının kullandığı kitaplık sürümlerinin kombinasyonunu kullanmayı deneyin. - Modül Gradle dosyası.
Roomdahil olmak üzere tüm Android Jetpack kitaplıkları ve coroutines'e ait bağımlılıkları inceleyin.
- Paketlere ve kullanıcı arayüzüne göz atın. Uygulama, işlevselliğe göre yapılandırılmıştır. Paket, bu bir dizi kod laboratuvarı boyunca kod ekleyeceğiniz yer tutucu dosyalar içerir.
Roomveritabanıyla ilgili tüm kodlar içindatabasepaketi.sleepqualityvesleeptrackerpaketleri her ekran için parçayı, görünüm modelini ve görünüm modeli fabrikasını içerir.
- Uyku kalitesi verilerinin gösterilmesine yardımcı olacak işlevleri içeren
Util.ktdosyasına göz atın. Bazı kodlar, daha sonra oluşturacağınız bir görünüm modeline başvurduğu için yorum satırı olarak işaretlenir. - androidTest klasörüne (
SleepDatabaseTest.kt) göz atın. Veritabanının beklendiği gibi çalıştığını doğrulamak için bu testi kullanacaksınız.
Android'de veriler, veri sınıflarında temsil edilir. Verilere, işlev çağrıları kullanılarak erişilir ve veriler değiştirilir. Ancak veritabanı dünyasında varlıklara ve sorgulara ihtiyacınız vardır.
- Varlık, veritabanında depolanacak bir nesneyi veya kavramı ve özelliklerini temsil eder. Bir öğe sınıfı tabloyu tanımlar ve bu sınıfın her örneği tablodaki bir satırı temsil eder. Her özellik bir sütunu tanımlar. Uygulamanızda, uykuyla ilgili bilgiler tutulur.
- Sorgu, bir veri tabanı tablosundan veya tablo kombinasyonundan veri ya da bilgi isteği ya da veriler üzerinde bir işlem gerçekleştirme isteğidir. Yaygın sorgular, varlıkları alma, ekleme ve güncelleme ile ilgilidir. Örneğin, kayıtlı tüm uyku gecelerini başlangıç zamanına göre sıralayarak sorgulayabilirsiniz.
Room, Kotlin veri sınıflarından SQLite tablolarında depolanabilen varlıklara ve işlev bildirimlerinden SQL sorgularına geçiş yapmanız için tüm zorlu işlemleri sizin yerinize yapar.
Her bir öğeyi açıklama eklenmiş bir veri sınıfı, etkileşimleri ise açıklama eklenmiş bir arayüz (veri erişim nesnesi (DAO)) olarak tanımlamanız gerekir. Room, veritabanında tablolar ve veritabanında işlem yapan sorgular oluşturmak için bu açıklama eklenmiş sınıfları kullanır.

1. adım: SleepNight öğesini oluşturun
Bu görevde, bir gecelik uykuyu açıklama eklenmiş bir veri sınıfı olarak tanımlayacaksınız.
Bir gecelik uyku için başlangıç zamanını, bitiş zamanını ve kalite derecesini kaydetmeniz gerekir.
Ayrıca geceyi benzersiz şekilde tanımlamak için bir kimliğe ihtiyacınız vardır.
databasepaketindeSleepNight.ktdosyasını bulup açın.- Kimlik, başlangıç zamanı (milisaniye cinsinden), bitiş zamanı (milisaniye cinsinden) ve sayısal uyku kalitesi derecelendirmesi için parametreler içeren
SleepNightveri sınıfını oluşturun.
sleepQualitydeğerini başlatmanız gerekir. Bu nedenle, kalite verisi toplanmadığını belirtmek için-1olarak ayarlayın.- Ayrıca bitiş zamanını da başlatmanız gerekir. Henüz bitiş saati kaydedilmediğini belirtmek için başlangıç saatine ayarlayın.
data class SleepNight(
var nightId: Long = 0L,
val startTimeMilli: Long = System.currentTimeMillis(),
var endTimeMilli: Long = startTimeMilli,
var sleepQuality: Int = -1
)- Sınıf bildiriminden önce veri sınıfını
@Entityile açıklama ekleyin. Tabloyudaily_sleep_quality_tableolarak adlandırın.tableNamebağımsız değişkeni isteğe bağlıdır ancak önerilir. Diğer bağımsız değişkenleri dokümanlarda arayabilirsiniz.
İstenirseEntityve diğer tüm ek açıklamalarıandroidxkitaplığından içe aktarın.
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(...)nightIdözelliğini birincil anahtar olarak tanımlamak içinnightIdözelliğine@PrimaryKeyekleyin.autoGenerateparametresinitrueolarak ayarlayın. BöyleceRoom, her bir öğe için kimlik oluşturur. Bu, her gece için kimliğin benzersiz olmasını sağlar.
@PrimaryKey(autoGenerate = true)
var nightId: Long = 0L,...- Kalan özellikleri
@ColumnInfoile açıklama ekleyin. Aşağıda gösterildiği gibi parametreleri kullanarak mülk adlarını özelleştirin.
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(
@PrimaryKey(autoGenerate = true)
var nightId: Long = 0L,
@ColumnInfo(name = "start_time_milli")
val startTimeMilli: Long = System.currentTimeMillis(),
@ColumnInfo(name = "end_time_milli")
var endTimeMilli: Long = startTimeMilli,
@ColumnInfo(name = "quality_rating")
var sleepQuality: Int = -1
)- Kodunuzu oluşturup çalıştırarak hatasız olduğundan emin olun.
Bu görevde bir veri erişim nesnesi (DAO) tanımlarsınız. Android'de DAO, veritabanına ekleme, silme ve güncelleme için kolaylık sağlayan yöntemler sunar.
Room veritabanı kullandığınızda kodunuzda Kotlin işlevlerini tanımlayıp çağırarak veritabanını sorgularsınız. Bu Kotlin işlevleri, SQL sorgularıyla eşlenir. Bu eşlemeleri, ek açıklamaları kullanarak bir DAO'da tanımlarsınız ve Room gerekli kodu oluşturur.
DAO'yu, veritabanınıza erişmek için özel bir arayüz tanımlama olarak düşünebilirsiniz.
Room kitaplığı, yaygın veritabanı işlemleri için @Insert, @Delete ve @Update gibi kolaylık sağlayan ek açıklamalar sunar. Diğer her şey için @Query ek açıklaması kullanılır. SQLite tarafından desteklenen herhangi bir sorguyu yazabilirsiniz.
Ek olarak, Android Studio'da sorgularınızı oluştururken derleyici, SQL sorgularınızda söz dizimi hataları olup olmadığını kontrol eder.
Uyku gecelerinin uyku izleyici veritabanı için aşağıdakileri yapabilmeniz gerekir:
- Yeni geceler ekleyin.
- Bitiş zamanını ve kalite derecelendirmesini güncellemek için mevcut bir geceyi güncelleyin.
- Anahtarına göre belirli bir geceyi alın.
- Tüm geceleri alın. Böylece bunları gösterebilirsiniz.
- En son geceyi alın.
- Veritabanındaki tüm girişleri silin.
1. adım: SleepDatabase DAO'yu oluşturun
databasepaketindeSleepDatabaseDao.ktöğesini açın.interfaceSleepDatabaseDaoifadesinin@Daoile açıklama eklendiğini unutmayın. Tüm DAO'lar@Daoanahtar kelimesiyle açıklama eklenmelidir.
@Dao
interface SleepDatabaseDao {}- Arayüzün gövdesine bir
@Insertek açıklaması ekleyin.@Insertöğesinin altına, bağımsız değişken olarakEntitysınıfının bir örneğiniSleepNightalan birinsert()işlevi ekleyin.
Hepsi bu kadar.Room,SleepNightöğesini veritabanına eklemek için gereken tüm kodu oluşturur. Kotlin kodunuzdaninsert()işlevini çağırdığınızdaRoom, varlığı veritabanına eklemek için bir SQL sorgusu yürütür. (Not: İşlevi istediğiniz gibi adlandırabilirsiniz.)
@Insert
fun insert(night: SleepNight)- Bir
SleepNightiçinupdate()işlevine sahip bir@Updateek açıklaması ekleyin. Güncellenen varlık, iletilen varlıkla aynı anahtara sahip olan varlıktır. Varlığın diğer özelliklerinin bir kısmını veya tamamını güncelleyebilirsiniz.
@Update
fun update(night: SleepNight)Kalan işlevler için kolaylık sağlayan bir ek açıklama yoktur. Bu nedenle, @Query ek açıklamasını kullanmanız ve SQLite sorguları sağlamanız gerekir.
Longkeybağımsız değişkenini alan ve null değer atanabilirSleepNightdöndüren birget()işleviyle@Queryek açıklaması ekleyin. Eksik parametreyle ilgili bir hata görürsünüz.
@Query
fun get(key: Long): SleepNight?- Sorgu, ek açıklamaya dize parametresi olarak sağlanır.
@Queryöğesine parametre ekleyin. Bunu SQLite sorgusu olan birStringyapın.
daily_sleep_quality_tableWHERE,nightId, :keybağımsız değişkeniyle eşleşiyor.:keysimgesine dikkat edin. İşlevdeki bağımsız değişkenlere referans vermek için sorguda iki nokta üst üste gösterimini kullanırsınız.
("SELECT * from daily_sleep_quality_table WHERE nightId = :key")@Queryişlevi ve SQLite sorgusu içeren başka bir@Queryekleyerekdaily_sleep_quality_table'deki her şeyiDELETE.clear()Bu sorgu, tablonun kendisini silmez.@Deletenotu bir öğeyi siler. Silinecek gecelerin listesini sağlamak için@Deletenotunu kullanabilirsiniz. Dezavantajı, tablonun içeriğini getirmeniz veya bilmeniz gerekmesidir.@Deletenotu, belirli girişleri silmek için idealdir ancak bir tablodaki tüm girişleri temizlemek için verimli değildir.
@Query("DELETE FROM daily_sleep_quality_table")
fun clear()getTonight()işleviyle@Queryekleyin. İşlevin tablonun boş olduğu durumu işleyebilmesi içingetTonight()tarafından döndürülenSleepNightdeğerini null yapılabilir hale getirin. (Tablo başlangıçta ve veriler temizlendikten sonra boştur.)
Veritabanından "bu gece"yi almak içinnightIddeğerine göre azalan sırada sıralanmış sonuç listesinin ilk öğesini döndüren bir SQLite sorgusu yazın. Yalnızca bir öğe döndürmek içinLIMIT 1kullanın.
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1")
fun getTonight(): SleepNight?@QueryişleviylegetAllNights()ekleme:
- SQLite sorgusunun,
daily_sleep_quality_tabletablosundaki tüm sütunları azalan düzende döndürmesini sağlayın. getAllNights(),SleepNightvarlıklarının listesiniLiveDataolarak döndürsün.Room, buLiveDataöğesini sizin için güncel tutar. Bu nedenle, verileri yalnızca bir kez açıkça almanız gerekir.LiveDatadosyasınıandroidx.lifecycle.LiveDatakonumundan içe aktarmanız gerekebilir.
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC")
fun getAllNights(): LiveData<List<SleepNight>>- Görünür bir değişiklik olmasa da uygulamanızda hata olmadığından emin olmak için uygulamayı çalıştırın.
Bu görevde, önceki görevde oluşturduğunuz Entity ve DAO'yu kullanan bir Room veritabanı oluşturursunuz.
@Database ile açıklama eklenmiş bir soyut veritabanı tutucu sınıfı oluşturmanız gerekir. Bu sınıfta, veritabanı yoksa veritabanının bir örneğini oluşturan, veritabanı varsa mevcut veritabanına referans döndüren bir yöntem bulunur.
Room veritabanı edinmek biraz karmaşık bir süreçtir. Bu nedenle, kodla çalışmaya başlamadan önce genel süreci aşağıda bulabilirsiniz:
public abstractsınıfı oluşturun.extends RoomDatabaseBu sınıf, veritabanı sahibi olarak hareket eder.Room, sizin için uygulamayı oluşturduğundan sınıf soyuttur.- Sınıfa
@Databaseile not ekleyin. Bağımsız değişkenlerde, veritabanı için varlıkları bildirin ve sürüm numarasını ayarlayın. companionnesnesinin içindeSleepDatabaseDaodöndüren bir soyut yöntem veya özellik tanımlayın.Roomsizin için e-postanın gövde kısmını oluşturur.- Uygulamanın tamamı için yalnızca bir
Roomveritabanı örneği gerekir. Bu nedenle,RoomDatabaseöğesini tekil yapın. - Veritabanı yoksa veritabanını oluşturmak için
Room'ın veritabanı oluşturucusunu kullanın. Aksi takdirde mevcut veritabanını döndürün.
1. adım: Veritabanını oluşturun
databasepaketindeSleepDatabase.ktöğesini açın.- Dosyada,
RoomDatabasesınıfını genişletenabstractsınıfınıSleepDatabaseadıyla oluşturun.
Sınıfı@Databaseile açıklama olarak ekleyin.
@Database()
abstract class SleepDatabase : RoomDatabase() {}- Eksik öğeler ve sürüm parametreleriyle ilgili bir hata görürsünüz.
@Databaseek açıklamasının,Roomveritabanını oluşturabilmesi için birkaç bağımsız değişken gerekir.
SleepNightöğesini,entitieslistesiyle birlikte tek öğe olarak sağlayın.versiondeğerini1olarak ayarlayın. Şemayı her değiştirdiğinizde sürüm numarasını artırmanız gerekir.- Şema sürümü geçmişi yedeklerini tutmamak için
exportSchemadeğerinifalseolarak ayarlayın.
entities = [SleepNight::class], version = 1, exportSchema = false- Veritabanının DAO hakkında bilgi sahibi olması gerekir. Sınıfın gövdesinde,
SleepDatabaseDaodeğerini döndüren bir soyut değer tanımlayın. Birden fazla DAO'nuz olabilir.
abstract val sleepDatabaseDao: SleepDatabaseDao- Bunun altında bir
companionnesnesi tanımlayın. Yardımcı nesne, istemcilerin sınıfı örneklemeden veritabanı oluşturma veya alma yöntemlerine erişmesine olanak tanır. Bu sınıfın tek amacı veritabanı sağlamak olduğundan, hiçbir zaman örnek oluşturulmasına gerek yoktur.
companion object {}companionnesnesinin içinde, veritabanı için özel bir null değer atanabilir değişkenINSTANCEtanımlayın ve bununullolarak başlatın. Bir veritabanı oluşturulduktan sonraINSTANCEdeğişkeni, veritabanına referans vermeye devam eder. Bu, veri tabanıyla bağlantıları tekrar tekrar açmaktan kaçınmanıza yardımcı olur. Bu işlem maliyetlidir.
INSTANCE öğesine @Volatile ile not ekleyin. Geçici bir değişkenin değeri hiçbir zaman önbelleğe alınmaz ve tüm yazma ve okuma işlemleri ana belleğe ve ana bellekten yapılır. Bu, INSTANCE değerinin her zaman güncel ve tüm yürütme iş parçacıkları için aynı olmasını sağlar. Bu, bir iş parçacığı tarafından INSTANCE üzerinde yapılan değişikliklerin diğer tüm iş parçacıkları tarafından anında görülebildiği ve örneğin iki iş parçacığının her birinin önbellekteki aynı öğeyi güncellemesi gibi bir durumun yaşanmadığı anlamına gelir. Bu durum sorun yaratır.
@Volatile
private var INSTANCE: SleepDatabase? = nullINSTANCEaltında,companionnesnesinin içinde, veritabanı oluşturucunun ihtiyaç duyacağı birContextparametresine sahip birgetInstance()yöntem tanımlayın.SleepDatabasetürünü döndürür.getInstance()henüz herhangi bir değer döndürmediği için hata görürsünüz.
fun getInstance(context: Context): SleepDatabase {}getInstance()içine birsynchronized{}bloğu ekleyin. Bağlama erişebilmek içinthisiletin.
Birden fazla iş parçacığı aynı anda bir veritabanı örneği isteyebilir ve bu da tek bir veritabanı yerine iki veritabanı oluşturulmasına neden olabilir. Bu sorunun bu örnek uygulamada yaşanma olasılığı düşüktür ancak daha karmaşık bir uygulamada yaşanabilir. Veritabanınısynchronizediçine almak için kodu sarmalama, bu kod bloğuna aynı anda yalnızca bir yürütme iş parçacığının girebileceği anlamına gelir. Bu da veritabanının yalnızca bir kez başlatılmasını sağlar.
synchronized(this) {}- Senkronize edilmiş blokta,
INSTANCEöğesinin geçerli değeriniinstanceadlı yerel bir değişkene kopyalayın. Bu, yalnızca yerel değişkenlerde kullanılabilen akıllı yayın özelliğinden yararlanmak için yapılır.
var instance = INSTANCEsynchronizedbloğunun içinde,synchronizedbloğunun sonundareturn instance. Döndürülen tür uyuşmazlığı hatasını yoksayın. İşiniz bittiğinde hiçbir zaman null döndürmeyeceksiniz.
return instancereturnifadesinin üstüne,instancedeğerinin boş olup olmadığını (yani henüz bir veritabanı olup olmadığını) kontrol etmek için birififadesi ekleyin.
if (instance == null) {}instancenullise veritabanı almak için veritabanı oluşturucuyu kullanın.ififadesinin gövdesindeRoom.databaseBuilderöğesini çağırın ve ilettiğiniz bağlamı, veritabanı sınıfını ve veritabanı adını (sleep_history_database) sağlayın. Hatayı kaldırmak için bir taşıma stratejisi eklemeniz ve aşağıdaki adımlardabuild()işlemini yapmanız gerekir.
instance = Room.databaseBuilder(
context.applicationContext,
SleepDatabase::class.java,
"sleep_history_database")- Gerekli taşıma stratejisini oluşturucuya ekleyin.
.fallbackToDestructiveMigration()kullanın.
Normalde, şema değiştiğinde bir taşıma stratejisi içeren bir taşıma nesnesi sağlamanız gerekir. Taşıma nesnesi, eski şemaya sahip tüm satırları nasıl alıp yeni şemadaki satırlara dönüştüreceğinizi tanımlayan bir nesnedir. Böylece hiçbir veri kaybolmaz. Taşıma bu codelab'in kapsamı dışındadır. Basit bir çözüm, veritabanını yok edip yeniden oluşturmaktır. Bu durumda veriler kaybolur.
.fallbackToDestructiveMigration()- Son olarak
.build()numaralı telefonu arayın.
.build()ififadesinde son adım olarakINSTANCE = instancedeğerini atayın.
INSTANCE = instance- Son kodunuz aşağıdaki gibi görünmelidir:
@Database(entities = [SleepNight::class], version = 1, exportSchema = false)
abstract class SleepDatabase : RoomDatabase() {
abstract val sleepDatabaseDao: SleepDatabaseDao
companion object {
@Volatile
private var INSTANCE: SleepDatabase? = null
fun getInstance(context: Context): SleepDatabase {
synchronized(this) {
var instance = INSTANCE
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
SleepDatabase::class.java,
"sleep_history_database"
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
}
return instance
}
}
}
}- Kodunuzu oluşturup çalıştırın.
Artık Room veritabanınızla çalışmak için gereken tüm yapı taşlarına sahipsiniz. Bu kod derlenip çalıştırılır ancak gerçekten çalışıp çalışmadığını anlamanın bir yolu yoktur. Bu nedenle, bazı temel testler eklemek için iyi bir zamandır.
2. adım: SleepDatabase'i test edin
Bu adımda, veritabanınızın çalıştığını doğrulamak için sağlanan testleri çalıştırırsınız. Bu, üzerine inşa etmeden önce veritabanının çalıştığından emin olmanıza yardımcı olur. Sağlanan testler basittir. Üretim uygulaması için tüm DAO'lardaki tüm işlevleri ve sorguları kullanırsınız.
Başlangıç uygulaması androidTest klasörü içerir. Bu androidTest klasörü, Android enstrümantasyonunu içeren birim testlerini içerir. Bu, testlerin Android çerçevesine ihtiyaç duyduğu anlamına gelir. Bu nedenle, testleri fiziksel veya sanal bir cihazda çalıştırmanız gerekir. Elbette, Android çerçevesini içermeyen saf birim testleri de oluşturup çalıştırabilirsiniz.
- Android Studio'da androidTest klasöründe SleepDatabaseTest dosyasını açın.
- Kodun yorumunu kaldırmak için yorumlanmış tüm kodu seçip
Cmd+/veyaControl+/klavye kısayoluna basın. - Dosyaya göz atın.
Yeniden kullanabileceğiniz bir kod parçası olduğu için test koduna hızlıca göz atalım:
SleepDabaseTest, bir test sınıfıdır.@RunWithek açıklaması, testleri ayarlayan ve yürüten program olan test çalıştırıcıyı tanımlar.- Kurulum sırasında,
@Beforeile açıklama eklenen işlev yürütülür veSleepDatabaseDaoile bellekteSleepDatabaseoluşturur. "Bellek içi", bu veritabanının dosya sistemine kaydedilmediği ve testler çalıştırıldıktan sonra silineceği anlamına gelir. - Ayrıca, bellek içi veritabanı oluşturulurken kod, teste özel başka bir yöntemi (
allowMainThreadQueries) çağırır. Varsayılan olarak, ana iş parçacığında sorgu çalıştırmaya çalıştığınızda hata alırsınız. Bu yöntem, yalnızca test sırasında yapmanız gereken ana iş parçacığında testler çalıştırmanıza olanak tanır. @Testile açıklama eklenmiş bir test yöntemindeSleepNightoluşturur, ekler ve alır, ardından bunların aynı olduğunu onaylarsınız. Bir hata oluşursa istisna oluşturun. Gerçek bir testte birden fazla@Testyönteminiz olur.- Test tamamlandığında, veritabanını kapatmak için
@Afterile açıklama eklenmiş işlev yürütülür.
- Proje bölmesinde test dosyasını sağ tıklayın ve "SleepDatabaseTest"i çalıştır'ı seçin.
- Testler çalıştırıldıktan sonra SleepDatabaseTest bölmesinde tüm testlerin başarılı olduğunu doğrulayın.

Tüm testler başarılı olduğundan artık şunları biliyorsunuz:
- Veritabanı doğru şekilde oluşturulur.
- Veritabanına
SleepNightekleyebilirsiniz. SleepNightgeri alabilirsiniz.SleepNight, kalite için doğru değere sahip.
Android Studio projesi: TrackMySleepQualityRoomAndTesting
Bir veritabanını test ederken DAO'da tanımlanan tüm yöntemleri uygulamanız gerekir. Testi tamamlamak için diğer DAO yöntemlerini kullanacak testler ekleyin ve bunları çalıştırın.
- Tablolarınızı
@Entityile açıklama eklenmiş veri sınıfları olarak tanımlayın.@ColumnInfoile açıklama eklenmiş özellikleri tablolarda sütun olarak tanımlayın. - Veri erişimi nesnesini (DAO)
@Daoile açıklama eklenmiş bir arayüz olarak tanımlayın. DAO, Kotlin işlevlerini veritabanı sorgularıyla eşler. @Insert,@Deleteve@Updateişlevlerini tanımlamak için ek açıklamaları kullanın.- Diğer tüm sorgular için parametre olarak bir SQLite sorgu dizesiyle
@Queryek açıklamasını kullanın. - Veritabanı döndüren bir
getInstance()işlevine sahip bir soyut sınıf oluşturun. - Veritabanınızın ve DAO'nunuzun beklendiği gibi çalıştığını test etmek için enstrümanlı testleri kullanın. Sağlanan testleri şablon olarak kullanabilirsiniz.
Udacity kursu:
Android Geliştirici Dokümanları:
RoomDatabaseDatabase(ek açıklamalar)Roomile ham sorguları kullanabilirsiniz.Roomdatabase.Builder- Test eğitimi
SQLiteDatabasesınıfıDaoRoomkalıcılık kitaplığı
Diğer belgeler ve makaleler:
Bu bölümde, bir eğitmenin yönettiği kurs kapsamında bu codelab'i tamamlayan öğrenciler için olası ödevler listelenmektedir. Eğitmen, aşağıdakileri yapmalıdır:
- Gerekirse ödev atayın.
- Öğrencilere ev ödevi ödevlerini nasıl göndereceklerini bildirin.
- Ödevlere not verin.
Eğitmenler bu önerileri istedikleri kadar kullanabilir ve uygun olduğunu düşündükleri diğer ödevleri verebilirler.
Bu codelab'i kendi başınıza tamamlıyorsanız bilginizi test etmek için bu ödevleri kullanabilirsiniz.
Bu soruları yanıtlayın
1. Soru
Bir sınıfın Room veritabanında depolanacak bir öğeyi temsil ettiğini nasıl belirtirsiniz?
- Sınıfı uzatın
DatabaseEntity. - Sınıfa
@Entityile not ekleyin. - Sınıfa
@Databaseile not ekleyin. - Sınıfı
RoomEntityile genişletin ve@Roomile açıklama ekleyin.
2. Soru
DAO (veri erişim nesnesi), Room'nın Kotlin işlevlerini veritabanı sorgularıyla eşlemek için kullandığı bir arayüzdür.
Bir arayüzün Room veritabanı için bir DAO'yu temsil ettiğini nasıl belirtirsiniz?
- Arayüzü genişletin
RoomDAO. - Arayüzü
EntityDaoolarak genişletin, ardındanDaoConnection()yöntemini uygulayın. - Arayüze
@Daoile not ekleyin. - Arayüze
@RoomConnectionile not ekleyin.
3. Soru
Aşağıdaki ifadelerden hangileri Room veritabanı hakkında doğrudur? Uygun olan tüm seçenekleri işaretleyin.
Roomveritabanı için tabloları açıklama eklenmiş veri sınıfları olarak tanımlayabilirsiniz.- Bir sorgudan
LiveDatadöndürürsenizRoom,LiveDatadeğişirseLiveDatadeğerini sizin için güncel tutar. - Her
Roomveritabanında yalnızca bir DAO olmalıdır. - Bir sınıfı
Roomveritabanı olarak tanımlamak için bu sınıfıRoomDatabasesınıfının alt sınıfı yapın ve@Databaseile açıklama ekleyin.
4. Soru
Aşağıdaki açıklamalardan hangilerini @Dao arayüzünüzde kullanabilirsiniz? Uygun olan tüm seçenekleri işaretleyin.
@Get@Update@Insert@Query
5. Soru
Veritabanınızın çalıştığını nasıl doğrulayabilirsiniz? Uygun olan tüm seçenekleri işaretleyin.
- Araçlı testler yazın.
- Veriler gösterilene kadar uygulamayı yazmaya ve çalıştırmaya devam edin.
- DAO arayüzündeki yöntemlere yapılan çağrıları
Entitysınıfındaki eşdeğer yöntemlere yapılan çağrılarla değiştirin. verifyDatabase()kitaplığı tarafından sağlananRoomişlevini çalıştırın.
Bir sonraki derse geçin:
Bu kurstaki diğer codelab'lerin bağlantılarını Android Kotlin Hakkında Temel Bilgiler codelab'leri açılış sayfasında bulabilirsiniz.