Android Kotlin Fundamentals 06.1: Oda veritabanı oluşturma

Bu codelab, Android Kotlin Temelleri kursuna dahildir. Codelab'ler üzerinden sırayla çalışıyorsanız bu kurstan en iyi şekilde yararlanabilirsiniz. Tüm kurs codelab'leri Android Kotlin Fundamentals codelabs açılış sayfasında listelenmektedir.

Giriş

Çoğu uygulama, kullanıcı uygulamayı kapattıktan sonra bile saklanması gereken verilere sahiptir. Örneğin, uygulama bir oynatma listesi, oyun öğelerinin envanteri, giderler ve gelir kayıtları, takımyıldızların bir kataloğu veya zaman içinde uyku verilerini depolayabilir. 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şlerini yapmasıyla ilgilenir. Ayrıca uygulamanızın, sıradan işlev çağrıları kullanarak veritabanıyla etkileşime geçmesini sağlar. Kapanışta, Room bir SQLite veritabanının üstündeki bir soyutlama katmanıdır. RoomDaha karmaşık sorgularda kullanılan terminoloji ve sorgu söz dizimi için SQLite modelini uygulayın.

Aşağıdaki görselde, Room veritabanının bu kursta önerilen genel mimariyle uyumlu olduğu gösterilmektedir.

Bilmeniz gerekenler

Aşağıdaki konular hakkında bilgi sahibi olmalısınız:

  • Bir Android uygulaması için temel kullanıcı arayüzü oluşturma
  • Etkinlikleri, parçaları ve görünümleri kullanma.
  • Parçalar arasında gezinme ve parçalar arasında veri iletmek için Güvenli Args (Gradle eklentisi) kullanma.
  • Modelleri, görünüm modeli fabrikalarını, LiveData ve gözlemcilerini görüntüleyin. Bu Bileşen Bileşeni konuları, bu kursun önceki bir codelab'inde ele alınmıştır.
  • SQL veritabanları ve SQLite dili ile ilgili temel bilgiler. Hızlı genel bakış veya bilgi tazeleme için SQLite Primer'a bakın.

Neler öğreneceksiniz?

  • Verileri korumak için Room veritabanı oluşturma ve onunla etkileşime geçme.
  • Veritabanındaki bir tabloyu tanımlayan veri sınıfının nasıl oluşturulacağı.
  • Kotlin işlevlerini SQL sorgularıyla eşlemek için veri erişimi nesnesi (DAO) nasıl kullanılır?
  • Veritabanınızın çalışıp çalışmadığını test etme.

Yapacaklarınız

  • Gecelik uyku verileri için arayüzü olan bir Room veritabanı oluşturun.
  • Sağlanan testleri kullanarak veritabanını test edin.

Bu codelab'de, uygulamanın uyku kalitesini izleyen veritabanı kısmını oluşturuyorsunuz. Uygulama, uyku verilerini zaman içinde depolamak için bir veritabanı kullanır.

Uygulamada, aşağıdaki resimde gösterildiği gibi parçalarla temsil edilen iki ekran vardır.

Solda gösterilen ilk ekranda izlemeyi başlatmak ve durdurmak için düğmeler 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ğ tarafta gösterilen ikinci ekran uyku kalitesi puanı seçmek içindir. Uygulamada, puan sayısal olarak gösterilir. Uygulama, geliştirme amacıyla hem yüz simgelerini hem de sayısal eşdeğerlerini gösterir.

Kullanıcının akışı şu şekildedir:

  • Kullanıcı uygulamayı açar ve uyku izleme ekranı sunulur.
  • Kullanıcı Başlat düğmesine dokunur. Bu işlem, başlangıç zamanını kaydeder ve gösterir. Başlat düğmesi devre dışıdır ve Durdur düğmesi etkindir.
  • Kullanıcı Durdur düğmesine dokunur. Bu işlem, bitiş zamanını kaydeder ve uyku kalitesi ekranını açar.
  • Kullanıcı bir uyku kalitesi simgesi seçer. Ekran kapanır ve izleme ekranında uyku bitiş zamanı ve uyku kalitesi görüntülenir. Durdur düğmesi devre dışıdır ve Başlat düğmesi etkindir. Uygulama başka bir gece için 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üş olmaksızın silinir. "Emin misiniz?" diye bir mesaj yoktur.

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 LiveData öğelerini görüntüleyin
  • Oda veritabanı

1. Adım: Başlangıç uygulamasını indirin ve çalıştırın

  1. GitHub'dan TrackMySleepquality-Starter uygulamasını indirin.
  2. Uygulamayı oluşturup çalıştırın. Uygulama, SleepTrackerFragment parçasının kullanıcı arayüzünü gösteriyor ancak veri yok. Düğmeler, dokunmaya yanıt vermez.

2. Adım: Başlangıç uygulamasını inceleyin

  1. Gradle dosyalarına göz atın:
  • Proje Gradle dosyası
    Proje düzeyindeki build.gradle dosyada, kitaplık sürümlerini belirten değişkenlere dikkat edin. Başlangıç uygulamasında kullanılan sürümler birlikte iyi çalışır ve bu uygulamayla iyi bir şekilde çalışır. Bu codelab'i tamamladığınızda sürümlerden bazılarını güncellemenizi isteyebilir. Uygulamadaki sürümleri güncellemek veya bu sürümlerde kalmak isteyip istemediğinize siz karar verirsiniz. "Olağan dışı" 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ı. Room dahil tüm Android Jetpack kitaplıkları için sağlanan bağımlılıklara ve eş yordamlar için bağımlılıklara dikkat edin.
  1. Paketlere ve kullanıcı arayüzüne göz atın. Uygulama, işleve göre yapılandırılmıştır. Paket, bu codelab serisi boyunca kod ekleyebileceğiniz yer tutucu dosyaları içerir.
  • Room veritabanıyla ilgili tüm kodlar için database paketi.
  • sleepquality ve sleeptracker paketleri her ekran için parça, model ve görünüm fabrikasını içerir.
  1. Uyku kalitesi verilerini göstermeye yardımcı olacak işlevler içeren Util.kt dosyasına göz atın. Bazı kodlar, daha sonra oluşturduğunuz bir görünüm modeline başvuruda bulunduğu için yorumlanır.
  2. androidTest klasörüne (SleepDatabaseTest.kt) göz atın. Bu testi, veritabanının amaçlandığı gibi çalıştığını doğrulamak için bu testi kullanırsınız.

Android'de veriler veri sınıflarında gösterilir ve verilere işlev çağrıları kullanılarak erişilip değiştirilir. Ancak, veritabanı dünyasında varlıklara ve sorgulara ihtiyacınız vardır.

  • Varlık, bir nesneyi veya kavramı ve özelliklerini, veritabanında depolanacak şekilde temsil eder. Varlık sınıfı bir tabloyu tanımlar ve bu sınıfın her örneği, tablodaki bir satırı temsil eder. Her özellik bir sütun tanımlar. Varlık, uygulamanızda bir gece uykusu hakkında bilgi tutar.
  • Sorgu, bir veritabanı tablosundan veya tablo kombinasyonundan veri ya da bilgi isteği veya veriler üzerinde bir işlem gerçekleştirme isteğidir. Varlıkları alma, ekleme ve güncelleme ile ilgili sık sorulan sorular. Örneğin, kayıtlı olan tüm uyku gecelerini, başlangıç zamanına göre sıralanmış şekilde sorgulayabilirsiniz.

Room, Kotlin veri sınıflarından SQLite tablolarında depolanabilecek varlıklara ve işlev bildirimlerinden SQL sorgularına kadar erişebilmeniz için gereken tüm çabayı gösterir.

Her varlığı ek açıklamalı bir veri sınıfı, etkileşimleri ise ek açıklamalı bir arayüz olarak veri erişimi nesnesi (DAO) olarak tanımlamanız gerekir. Room, veritabanında tablo ve veritabanı üzerinde işlem gerçekleştiren sorgular oluşturmak için bu ek açıklamalı sınıfları kullanır.

1. Adım: SleepNight varlığını oluşturun

Bu görevde bir gecelik uykuyu ek açıklamalı veri sınıfı olarak tanımlarsınız.

Bir gecelik uykunun başlangıç saatini, bitiş saatini ve kalite puanını kaydetmeniz gerekir.

Geceyi benzersiz bir şekilde tanımlamak için kimliğe ihtiyacınız vardır.

  1. database paketinde SleepNight.kt dosyasını bulup açın.
  2. Kimlik, başlangıç zamanı (milisaniye cinsinden), bitiş zamanı (milisaniye cinsinden) ve sayısal uyku kalitesi puanı parametrelerini içeren SleepNight veri sınıfını oluşturun.
  • sleepQuality öğesini başlatmanız gerekir. Bu nedenle, kaliteyi toplamadığını belirtmek için değeri -1 olarak ayarlayın.
  • Bitiş zamanını da başlatmanız gerekir. Henüz bitiş zamanı kaydedilmediğini belirtmek için başlangıç zamanına ayarlayın.
data class SleepNight(
       var nightId: Long = 0L,
       val startTimeMilli: Long = System.currentTimeMillis(),
       var endTimeMilli: Long = startTimeMilli,
       var sleepQuality: Int = -1
)
  1. Sınıf beyanından önce, veri sınıfına @Entity ekleyin. Tabloya daily_sleep_quality_table adını verin. tableName bağımsız değişkeni isteğe bağlıdır, ancak önerilir. Dokümanlarda başka bağımsız değişkenleri de arayabilirsiniz.

    İstenirse androidx kitaplığından Entity ve diğer tüm ek açıklamaları içe aktarın.
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(...)
  1. nightId öğesini birincil anahtar olarak tanımlamak için nightId özelliğine @PrimaryKey ekleyin. Room parametresini her varlık için kimlik oluşturmak üzere autoGenerate parametresini true olarak ayarlayın. Bu, her gecenin kimliğinin benzersiz olduğunu garanti eder.
@PrimaryKey(autoGenerate = true)
var nightId: Long = 0L,...
  1. Kalan mülklere @ColumnInfo ile ek açıklama ekleyin. Parametre adlarını kullanarak aşağıda gösterildiği gibi 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
)
  1. Kodunuzun hatasız olduğundan emin olmak için kodunuzu oluşturun ve çalıştırın.

Bu görevde bir veri erişimi nesnesi (DAO) tanımlarsınız. DAO, Android'de veritabanı ekleme, silme ve güncelleme işlemleri için kolay 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 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ımlamak gibi düşünebilirsiniz.

Yaygın veritabanı işlemleri için Room kitaplığı, @Insert, @Delete ve @Update gibi kolaylık ek açıklamaları sağlar. Diğer her şey için @Query ek açıklaması bulunur. SQLite tarafından desteklenen herhangi bir sorgu yazabilirsiniz.

Ayrıca, Android Studio'da sorgularınızı oluştururken derleyici, SQL sorgularınızı söz dizimi hatası olup olmadığını kontrol eder.

Uyku gecelerinin uyku izleyici veritabanı için aşağıdakileri yapabilmeniz gerekir:

  • Yeni geceler ekleyin.
  • Bitiş saatini ve kalite puanını güncellemek için mevcut bir geceyi güncelleyin.
  • Anahtarına göre belirli bir gece alın.
  • Gösterebilmeniz için tüm geceleri alın.
  • En yeni geceyi dinleyin.
  • Veritabanındaki tüm girişleri silin.

1. Adım: SleepDatabase DAO'yu oluşturun

  1. database paketinde SleepDatabaseDao.kt öğesini açın.
  2. interface SleepDatabaseDao açıklaması, @Dao ile belirtilir. Tüm DAO'lara @Dao anahtar kelimesiyle ek açıklama girilmelidir.
@Dao
interface SleepDatabaseDao {}
  1. Arayüzün gövdesine bir @Insert ek açıklaması ekleyin. @Insert öğesinin altına, bağımsız değişken olarak SleepNight sınıfınınSleepNight Entity sınıfının bir örneğini alan bir insert() işlevi ekleyin.

    Hepsi bu kadar. Room, SleepNight dosyasını veritabanına eklemek için gerekli tüm kodu oluşturur. Kotlin kodunuzdan insert() çağırdığınızda Room, varlığı veritabanına eklemek için bir SQL sorgusu yürütür. (Not: İşlevi istediğiniz gibi çağırabilirsiniz.)
@Insert
fun insert(night: SleepNight)
  1. Bir SleepNight için update() işlevine sahip bir @Update ek açıklaması ekleyin. Güncellenen varlık, iletilen varlıkla aynı anahtara sahip 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 ek açıklama bulunmaz. Bu nedenle, @Query ek açıklamasını kullanmanız ve SQLite sorgularını sağlamanız gerekir.

  1. Long key bağımsız değişkeni alıp boş bir SleepNight değeri döndüren get() işlevine sahip bir @Query ek açıklaması ekleyin. Eksik bir parametre için bir hata görürsünüz.
@Query
fun get(key: Long): SleepNight?
  1. Sorgu, ek açıklama için bir dize parametresi olarak sağlanır. @Query öğesine bir parametre ekleyin. Bu sorguyu bir SQLite sorgusu olan String yapın.
  • daily_sleep_quality_table sütunundaki tüm sütunları seç
  • WHERE nightId, :key bağımsız değişkeniyle eşleşiyor.

    :key düğmesine 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")
  1. daily_sleep_quality_table işlevindeki her şeyi DELETE işlevine bir clear() işlevi ve bir SQLite sorgusu ile başka bir @Query ekleyin. Bu sorgu, tablonun kendisini silmez.

    @Delete ek açıklaması bir öğeyi siler. Siz de @Delete kullanabilir ve silinecek gecelerin listesini sağlayabilirsiniz. Dezavantaj, tabloda neyi getirdiğini veya bilmesinin gerekmesidir. @Delete ek açıklaması, belirli girişleri silmek için idealdir ancak bir tablodaki tüm girişleri temizlemek için etkili değildir.
@Query("DELETE FROM daily_sleep_quality_table")
fun clear()
  1. getTonight() işlevine sahip @Query ekleyin. İşlevin, tablonun boş olduğu durumları kaldırabilmesi için getTonight() öğesinin döndürdüğü SleepNight değerini boş belirleyin. (Tablonun başında ve verileri boşken) Yalnızca bir öğe döndürmek için LIMIT 1 kullanın.
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1")
fun getTonight(): SleepNight?
  1. getAllNights() işlevine sahip @Query ekleyin:
  • SQLite sorgusunun daily_sleep_quality_table sütunundaki tüm sütunları azalan düzende döndürmesini sağlayın.
  • getAllNights() adlı işletmenin, SleepNight varlıklarının listesini LiveData olarak döndürmesini sağlayın. Room, bu LiveData öğesini sizin için günceller. Böylece, verileri yalnızca bir kez açık bir şekilde almanız yeterlidir.
  • LiveData içe aktarma işlemini androidx.lifecycle.LiveData kaynağından gerçekleştirmeniz gerekebilir.
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC")
fun getAllNights(): LiveData<List<SleepNight>>
  1. Görülen değişiklikleri görmeyeceksiniz ancak herhangi bir hata bulunmadığından emin olmak için uygulamanızı ç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çıklanmış soyut bir veritabanı sahibi sınıfı oluşturmanız gerekir. Bu sınıfta, veritabanı mevcut değilse veritabanının bir örneğini oluşturan veya mevcut bir veritabanına referans veren bir yöntem bulunur.

Room veritabanı almak biraz dahil olduğundan koda başlamadan önce genel süreç aşağıda açıklanmıştır:

  • extends RoomDatabase bulunan bir public abstract sınıfı oluşturun. Bu ders, veritabanı sahibi olarak hareket etmektir. Room sizin için uygulama oluşturduğundan sınıf soyut olduğundan.
  • Sınıfa @Database ile ek açıklama ekleyin. Bağımsız değişkenlerde, veritabanının varlıklarını bildirin ve sürüm numarasını ayarlayın.
  • Bir companion nesnesinin içinde, SleepDatabaseDao değeri döndüren bir soyut yöntem veya özellik tanımlayın. Room sizin için gövdeyi oluşturur.
  • Uygulamanın tamamı için Room veritabanının yalnızca bir örneğine ihtiyacınız var. Bu nedenle RoomDatabase birimini tek bir sayı yapın.
  • Yalnızca veritabanı mevcut değilse veritabanını oluşturmak için Room' veritabanı oluşturucuyu kullanın. Aksi takdirde mevcut veritabanını döndürün.

1. Adım: Veritabanını oluşturun

  1. database paketinde SleepDatabase.kt öğesini açın.
  2. Dosyada, RoomDatabase süresini uzatan, SleepDatabase adlı bir abstract sınıfı oluşturun.

    Sınıfa @Database ile ek açıklama ekleyin.
@Database()
abstract class SleepDatabase : RoomDatabase() {}
  1. Eksik öğeler ve sürüm parametreleri için bir hata mesajı gösterilir. @Database Room veritabanını oluşturabilmek için birkaç bağımsız değişken gerektirir.
  • SleepNight öğesini, entities listesine sahip tek öğe olarak sağlayın.
  • version değerini 1 olarak ayarlayın. Şemayı her değiştirdiğinizde sürüm numarasını artırmanız gerekir.
  • Şema sürümü geçmiş yedeklemelerini saklamamak için exportSchema öğesini false olarak ayarlayın.
entities = [SleepNight::class], version = 1, exportSchema = false
  1. Veritabanının DAO hakkında bilgi sahibi olması gerekir. Sınıfın gövdesinde, SleepDatabaseDao değerini döndüren soyut değeri bildirin. Birden fazla DAO'nuz olabilir.
abstract val sleepDatabaseDao: SleepDatabaseDao
  1. Bunun altında bir companion nesnesi tanımlayın. Tamamlayıcı nesne, istemcilerin sınıfı örnek almadan veritabanı oluşturma veya alma yöntemlerine erişmesine olanak tanır. Bu sınıfın tek amacı veritabanı sağlamak olduğundan, örneklendirme yapmanız için bir neden yoktur.
 companion object {}
  1. companion nesnesinin içinde veritabanı için özel bir null değişkeni INSTANCE tanımlayın ve bunu null olarak başlatın. INSTANCE değişkeni, oluşturulduktan sonra veritabanına başvuruyu sürdürür. Bu da veritabanının bağlantılarını tekrar tekrar açmaktan kaçınmanıza yardımcı olur. Bu da pahalıdır.

@Volatile ile INSTANCE ek açıklama ekleyin. Değişken değişkenin değeri hiçbir zaman önbelleğe alınmaz ve tüm yazma ve okuma işlemleri ana belleğe yapılır ve ana bellekten yapılır. Bu, INSTANCE değerinin her zaman güncel ve tüm yürütme ileti dizileri için aynı olmasını sağlar. Bu, bir ileti dizisi tarafından INSTANCE olarak yapılan değişikliklerin diğer tüm ileti dizileri için hemen görünür olacağı ve örneğin iki ileti dizisinin aynı öğeyi önbellekte güncellediği ve bu durumda sorunun ortaya çıkabileceği bir durum elde etmediğiniz anlamına gelir.

@Volatile
private var INSTANCE: SleepDatabase? = null
  1. INSTANCE altında, companion nesnesinin altında veritabanı oluşturucunun ihtiyaç duyacağı bir Context parametresiyle getInstance()yöntem tanımlayın. Tür SleepDatabase döndürün. getInstance() henüz bir şey döndürmediği için bir hata göreceksiniz.
fun getInstance(context: Context): SleepDatabase {}
  1. getInstance() içine bir synchronized{} bloğu ekleyin. Bağlama erişmek için this değerini iletin.

    Birden çok ileti dizisi aynı anda bir veritabanı örneği isteyebilir. Bu işlem bir veritabanı yerine iki veritabanı oluşturur. Bu sorun bu örnek uygulamada gerçekleşemez, ancak daha karmaşık bir uygulama için mümkündür. Veritabanını synchronized haline getirmek için kodu sarmalamak, aynı anda yalnızca bir yürütme ileti dizisinin bu kod bloğunu girerek veritabanının yalnızca bir kez başlatılmasını sağlar.
synchronized(this) {}
  1. Senkronize edilen blokun içinde, INSTANCE değerini geçerli olan instance yerel değişkenine kopyalayın. Bunun için, yalnızca yerel değişkenlerde kullanılabilen akıllı yayından yararlanmak gerekir.
var instance = INSTANCE
  1. synchronized blokun sonunda, synchronized bloğunun sonunda return instance. İade türü uyuşmazlığı hatasını yoksayın; işiniz bittiğinde asla boş değer döndürmezsiniz.
return instance
  1. instance ifadesinin null olup olmadığını (yani henüz veritabanı olup olmadığını) kontrol etmek için return ifadesinin üzerine bir if ifadesi ekleyin.
if (instance == null) {}
  1. instance değeri null ise veritabanı almak için veritabanı oluşturucuyu kullanın. if ifadesinin gövdesinde Room.databaseBuilder öğesini çağırıp ilettiğiniz bağlamı, veritabanı sınıfını ve veritabanı için bir ad (sleep_history_database) sağlayın. Hatayı kaldırmak için aşağıdaki adımlarda bir taşıma stratejisi ve build() eklemeniz gerekir.
instance = Room.databaseBuilder(
                           context.applicationContext,
                           SleepDatabase::class.java,
                           "sleep_history_database")
  1. Gerekli taşıma stratejisini oluşturucuya ekleyin. .fallbackToDestructiveMigration() kullanın.

    Normalde, şemanın ne zaman değiştiğine dair bir taşıma stratejisi bulunan bir taşıma nesnesi sağlamanız gerekir. Taşıma nesnesi, tüm verilerin eski şemayla nasıl alınacağını ve yeni şemadaki satırlara nasıl dönüştürüleceğini tanımlayan bir veridir. Böylece hiçbir veri kaybı yaşanmaz. Taşıma, bu codelab'in kapsamı dışındadır. Basit bir çözüm, veritabanını yok etmek ve yeniden oluşturmaktır. Bu, verilerin kaybedileceği anlamına gelir.
.fallbackToDestructiveMigration()
  1. Son olarak .build() numaralı telefonu arayın.
.build()
  1. if ifadesi içinde son adım olarak INSTANCE = instance atayın.
INSTANCE = instance
  1. Son kodunuz şöyle 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
           }
       }
   }
}
  1. Kodunuzu oluşturun ve çalıştırın.

Artık Room veritabanınızla çalışmak için gereken tüm yapı taşlarına sahipsiniz. Bu kod derlenir ve çalışır, ancak gerçekten çalışıp çalışmadığını göremezsiniz. Bu, temel testler eklemenin tam zamanı.

2. Adım: SleepDatabase'ı test edin

Bu adımda, veritabanınızın çalıştığını doğrulamak için sağlanan testler çalıştırırsınız. Bu, veritabanının veritabanına eklenmeden önce çalıştığından emin olmanıza yardımcı olur. Sağlanan testler temeldir. Bir üretim uygulaması için tüm DAO'lardaki tüm işlevleri ve sorguları kullanırsınız.

Başlangıç uygulamasında androidTest klasörü bulunur. Bu androidTest klasörü, Android araçları içeren birim testleri içerir. Bu, testlerin Android çerçevesine ihtiyacı olduğunu söylemenin lüks bir yoludur. Bu nedenle, testleri fiziksel veya sanal bir cihazda çalıştırmanız gerekir. Elbette, Android çerçevesini içermeyen saf birim testleri de oluşturabilir ve çalıştırabilirsiniz.

  1. Android Studio'daki androidTest klasöründe, SleepDatabaseTest dosyasını açın.
  2. Kodun yorumunu kaldırmak için, yorum yapılan tüm kodu seçin ve Cmd+/ veya Control+/ klavye kısayoluna basın.
  3. Dosyaya göz atın.

Aşağıda, yeniden kullanabileceğiniz başka bir kod parçası yer aldığından, test kodunun hızlı bir özetini bulabilirsiniz:

  • SleepDabaseTest bir test sınıfıdır.
  • @RunWith ek açıklaması, testleri oluşturan ve yürüten program olan test çalıştırıcısını tanımlar.
  • Kurulum sırasında, @Before ile ek açıklamalı işlevler yürütülür ve SleepDatabaseDao ile bellek içi SleepDatabase oluş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.
  • Kod ayrıca bellek içi veritabanını oluştururken teste özel başka bir yöntem (allowMainThreadQueries) çağırır. Varsayılan olarak, ana ileti dizisinde sorgu çalıştırmayı denediğinizde bir hata alırsınız. Bu yöntem, ana ileti dizisinde test yapmanızı sağlar. Bunu yalnızca test sırasında yapmanız gerekir.
  • @Test ile ek açıklamalı bir test yönteminde bir SleepNight oluşturur, ekler, alır ve aynı olduklarını iddia edersiniz. Bir sorun olursa istisna oluşturun. Gerçek testte birden fazla @Test yönteminiz olur.
  • Test tamamlandığında @After ek açıklamasını içeren işlev, veritabanını kapatmak için yürütülür.
  1. Proje bölmesinde test dosyasını sağ tıklayın ve Çalıştır 'SleepDatabaseTest''u seçin.
  2. 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ğu için artık birkaç şey biliyorsunuz:

  • Veritabanı doğru şekilde oluşturulur.
  • Veritabanına bir SleepNight ekleyebilirsiniz.
  • SleepNight uygulamasını geri 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 uygulamak için testler ekleyin ve çalıştırın.

  • Tablolarınızı @Entity ile ek açıklamalı veri sınıfları olarak tanımlayın. @ColumnInfo ile ek açıklamalı özellikleri tablolarda sütunlar olarak tanımlayın.
  • Bir veri erişimi nesnesini (DAO) @Dao açıklaması içeren bir arayüz olarak tanımlayın. DAO, Kotlin işlevlerini veritabanı sorgularıyla eşler.
  • @Insert, @Delete ve @Update işlevlerini tanımlamak için ek açıklamaları kullanın.
  • Diğer tüm sorgular için parametre olarak bir SQLite sorgu dizesiyle @Query ek açıklamasını kullanın.
  • Veritabanı döndüren getInstance() işlevine sahip soyut sınıf oluşturun.
  • Veritabanınızın ve DAO'nuzun beklendiği gibi çalıştığını test etmek için araçlı testleri kullanın. Sağlanan testleri şablon olarak kullanabilirsiniz.

Udacity kursu:

Android Geliştirici Dokümanları:

Diğer dokümanlar ve makaleler:

Bu bölümde, bir eğitmen tarafından sunulan kurs kapsamında bu codelab üzerinden çalışan öğrenciler için olası ev ödevi ödevleri listelenmektedir. Öğretmenin şunları yapması gerekir:

  • Gerekirse ev ödevini atayın.
  • Öğrencilere ev ödevlerinin nasıl gönderileceğini bildirin.
  • Ev ödevlerine not verin.

Öğretmenler bu önerileri istedikleri kadar kullanabilir veya uygun görebilir ve uygun olan diğer ev ödevlerini atayabilirler.

Bu codelab'de kendiniz çalışıyorsanız, bilginizi test etmek için bu ödevlerden yararlanabilirsiniz.

Bu soruları yanıtlayın

1. Soru

Bir sınıfın, Room veritabanında depolanacak bir varlığı temsil ettiğini nasıl belirtirsiniz?

  • Dersin kapsamını DatabaseEntity uzatın.
  • Sınıfa @Entity ile ek açıklama ekleyin.
  • Sınıfa @Database ile ek açıklama ekleyin.
  • Sınıfı RoomEntity uzatın ve ayrıca sınıfa @Room ile not ekleyin.

2. Soru

DAO (veri erişimi nesnesi), Room'nin Kotlin işlevlerini veritabanı sorgularıyla eşlemek için kullandığı bir arayüzdür.

Bir arayüzün, Room veritabanı için DAO'yu temsil ettiğini nasıl belirtirsiniz?

  • Arayüzün RoomDAO uzatılmasını sağlayın.
  • Arayüzün EntityDao parametresini uzatıp DaoConnection() yöntemini uygulayın.
  • Arayüze @Dao ile ek açıklama ekleyin.
  • Arayüze @RoomConnection ile ek açıklama ekleyin.

3. Soru

Room veritabanı ile ilgili olarak aşağıdaki ifadelerden hangisi doğrudur? Geçerli olan tüm seçenekleri işaretleyin.

  • Bir Room veritabanı için tabloları, ek açıklamalı veri sınıfları olarak tanımlayabilirsiniz.
  • Bir sorgudan LiveData sonucunu döndürürseniz Room değişirse LiveData öğesi sizin için güncellenir.
  • Her Room veritabanında sadece bir tane DAO olmalıdır.
  • Bir sınıfı Room veritabanı olarak tanımlamak için bu sınıfı RoomDatabase alt sınıfı yapın ve @Database ile not ekleyin.

4. Soru

@Dao arayüzünüzde aşağıdaki ek açıklamalardan hangisini kullanabilirsiniz? Geçerli olan tüm seçenekleri işaretleyin.

  • @Get
  • @Update
  • @Insert
  • @Query

5. Soru

Veritabanınızın çalıştığını nasıl doğrulayabilirsiniz? Geçerli olan tüm seçenekleri işaretleyin.

  • Enstrümantal testler yazın.
  • Veriler görüntülenene kadar uygulamayı yazmaya ve çalıştırmaya devam edin.
  • DAO arayüzündeki yöntemlere yapılan çağrıları, Entity sınıfındaki eşdeğer yöntemlere yapılan çağrılarla değiştirin.
  • Room kitaplığı tarafından sağlanan verifyDatabase() işlevini çalıştırın.

Sonraki derse başlayın: 6.2 Korintler ve Oda

Bu kurstaki diğer codelab'lerin bağlantılarına ulaşmak için Android Kotlin Fundamentals codelabs açılış sayfasına göz atın.