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. Room
Daha 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
- GitHub'dan TrackMySleepquality-Starter uygulamasını indirin.
- 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
- Gradle dosyalarına göz atın:
- Proje Gradle dosyası
Proje düzeyindekibuild.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.
- 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çindatabase
paketi.sleepquality
vesleeptracker
paketleri her ekran için parça, model ve görünüm fabrikasını içerir.
- 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. - 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.
database
paketindeSleepNight.kt
dosyasını bulup açın.- 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
)
- Sınıf beyanından önce, veri sınıfına
@Entity
ekleyin. Tabloyadaily_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.
İstenirseandroidx
kitaplığındanEntity
ve diğer tüm ek açıklamaları içe aktarın.
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(...)
nightId
öğesini birincil anahtar olarak tanımlamak içinnightId
özelliğine@PrimaryKey
ekleyin.Room
parametresini her varlık için kimlik oluşturmak üzereautoGenerate
parametresinitrue
olarak ayarlayın. Bu, her gecenin kimliğinin benzersiz olduğunu garanti eder.
@PrimaryKey(autoGenerate = true)
var nightId: Long = 0L,...
- 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
)
- 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
database
paketindeSleepDatabaseDao.kt
öğesini açın.interface
SleepDatabaseDao
açıklaması,@Dao
ile belirtilir. Tüm DAO'lara@Dao
anahtar kelimesiyle ek açıklama girilmelidir.
@Dao
interface SleepDatabaseDao {}
- Arayüzün gövdesine bir
@Insert
ek açıklaması ekleyin.@Insert
öğesinin altına, bağımsız değişken olarakSleepNight
sınıfınınSleepNight
Entity
sınıfının bir örneğini alan birinsert()
işlevi ekleyin.
Hepsi bu kadar.Room
,SleepNight
dosyasını veritabanına eklemek için gerekli tüm kodu oluşturur. Kotlin kodunuzdaninsert()
çağırdığınızdaRoom
, 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)
- Bir
SleepNight
içinupdate()
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.
Long
key
bağımsız değişkeni alıp boş birSleepNight
değeri döndürenget()
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?
- Sorgu, ek açıklama için bir dize parametresi olarak sağlanır.
@Query
öğesine bir parametre ekleyin. Bu sorguyu bir SQLite sorgusu olanString
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")
daily_sleep_quality_table
işlevindeki her şeyiDELETE
işlevine birclear()
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()
getTonight()
işlevine sahip@Query
ekleyin. İşlevin, tablonun boş olduğu durumları kaldırabilmesi içingetTonight()
öğesinin döndürdüğüSleepNight
değerini boş belirleyin. (Tablonun başında ve verileri boşken) Yalnızca bir öğe döndürmek içinLIMIT 1
kullanın.
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1")
fun getTonight(): SleepNight?
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 listesiniLiveData
olarak döndürmesini sağlayın.Room
, buLiveData
öğ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şleminiandroidx.lifecycle.LiveData
kaynağından gerçekleştirmeniz gerekebilir.
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC")
fun getAllNights(): LiveData<List<SleepNight>>
- 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 birpublic 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 nedenleRoomDatabase
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
database
paketindeSleepDatabase.kt
öğesini açın.- Dosyada,
RoomDatabase
süresini uzatan,SleepDatabase
adlı birabstract
sınıfı oluşturun.
Sınıfa@Database
ile ek açıklama ekleyin.
@Database()
abstract class SleepDatabase : RoomDatabase() {}
- 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ğerini1
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
öğesinifalse
olarak 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,
SleepDatabaseDao
değerini döndüren soyut değeri bildirin. Birden fazla DAO'nuz olabilir.
abstract val sleepDatabaseDao: SleepDatabaseDao
- 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 {}
companion
nesnesinin içinde veritabanı için özel bir null değişkeniINSTANCE
tanımlayın ve bununull
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
INSTANCE
altında,companion
nesnesinin altında veritabanı oluşturucunun ihtiyaç duyacağı birContext
parametresiylegetInstance()
yöntem tanımlayın. TürSleepDatabase
döndürün.getInstance()
henüz bir şey döndürmediği için bir hata göreceksiniz.
fun getInstance(context: Context): SleepDatabase {}
getInstance()
içine birsynchronized{}
bloğu ekleyin. Bağlama erişmek içinthis
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) {}
- Senkronize edilen blokun içinde,
INSTANCE
değerini geçerli olaninstance
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
synchronized
blokun sonunda,synchronized
bloğunun sonundareturn instance
. İade türü uyuşmazlığı hatasını yoksayın; işiniz bittiğinde asla boş değer döndürmezsiniz.
return instance
instance
ifadesinin null olup olmadığını (yani henüz veritabanı olup olmadığını) kontrol etmek içinreturn
ifadesinin üzerine birif
ifadesi ekleyin.
if (instance == null) {}
instance
değerinull
ise veritabanı almak için veritabanı oluşturucuyu kullanın.if
ifadesinin gövdesindeRoom.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 vebuild()
eklemeniz gerekir.
instance = Room.databaseBuilder(
context.applicationContext,
SleepDatabase::class.java,
"sleep_history_database")
- 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()
- Son olarak
.build()
numaralı telefonu arayın.
.build()
if
ifadesi içinde son adım olarakINSTANCE = instance
atayın.
INSTANCE = instance
- 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
}
}
}
}
- 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.
- Android Studio'daki androidTest klasöründe, SleepDatabaseTest dosyasını açın.
- Kodun yorumunu kaldırmak için, yorum yapılan tüm kodu seçin ve
Cmd+/
veyaControl+/
klavye kısayoluna basın. - 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 veSleepDatabaseDao
ile bellek içiSleepDatabase
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 birSleepNight
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.
- Proje bölmesinde test dosyasını sağ tıklayın ve Çalıştır 'SleepDatabaseTest''u 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ğ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ı:
RoomDatabase
Database
(ek açıklamalar)Room
ile ham sorguları kullanabilirsiniz.Roomdatabase.Builder
- Test eğitimi
SQLiteDatabase
sınıfıDao
Room
süreklilik kitaplığı
Diğer dokümanlar ve makaleler:
- Singleton kalıbı
- Google Geliştirici Uzmanlarından: Dalgalı ve senkronize bir şekilde düzgün şekilde kullanıldığında
- Tamamlayıcı nesneler
- Oda ile taşıma işlemlerini anlama
- Oda taşıma işlemlerini test etme
- Veritabanı geçmişi
- SQLite web sitesi
- SQLite tarafından anlaşıldığı şekilde SQL'in tam açıklaması
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ıpDaoConnection()
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ürsenizRoom
değişirseLiveData
öğ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ğlananverifyDatabase()
işlevini çalıştırın.
Sonraki derse başlayın:
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.