Odayı kullanarak verileri yerel veritabanına kaydetme Android Jetpack'in bir parçasıdır.
Önemsiz miktarda yapılandırılmış veri işleyen uygulamalar, bu verileri yerel olarak saklamanızı sağlar. En yaygın kullanım alanı, resimdeki alakalı Cihaz ağa erişemediğinde kullanıcının çevrimdışıyken de bu içeriğe göz atmaya devam edebilir.
Oda kalıcılık kitaplığı, izin vermek için SQLite üzerinde bir soyutlama katmanı sağlar ve SQLite'ın tüm gücünden yararlanır. Özellikle, Oda, aşağıdaki avantajları sunar:
- SQL sorgularının derleme zamanında doğrulanması.
- Tekrar eden ve hataya açık ortak metinleri en aza indiren kullanışlı ek açıklamaları girin.
- Sadeleştirilmiş veritabanı taşıma yolları.
Bu göz önünde bulundurulduğunda, bunun yerine Oda etiketini kullanmanızı önemle tavsiye ederiz doğrudan SQLite API'lerini kullanmayı deneyin.
Kurulum
Uygulamanızda Oda özelliğini kullanmak için aşağıdaki bağımlılıkları uygulamanızın
build.gradle
dosyası:
Eski
dependencies { def room_version = "2.6.1" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" // To use Kotlin annotation processing tool (kapt) kapt "androidx.room:room-compiler:$room_version" // To use Kotlin Symbol Processing (KSP) ksp "androidx.room:room-compiler:$room_version" // optional - RxJava2 support for Room implementation "androidx.room:room-rxjava2:$room_version" // optional - RxJava3 support for Room implementation "androidx.room:room-rxjava3:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture implementation "androidx.room:room-guava:$room_version" // optional - Test helpers testImplementation "androidx.room:room-testing:$room_version" // optional - Paging 3 Integration implementation "androidx.room:room-paging:$room_version" }
Kotlin
dependencies { val room_version = "2.6.1" implementation("androidx.room:room-runtime:$room_version") annotationProcessor("androidx.room:room-compiler:$room_version") // To use Kotlin annotation processing tool (kapt) kapt("androidx.room:room-compiler:$room_version") // To use Kotlin Symbol Processing (KSP) ksp("androidx.room:room-compiler:$room_version") // optional - Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:$room_version") // optional - RxJava2 support for Room implementation("androidx.room:room-rxjava2:$room_version") // optional - RxJava3 support for Room implementation("androidx.room:room-rxjava3:$room_version") // optional - Guava support for Room, including Optional and ListenableFuture implementation("androidx.room:room-guava:$room_version") // optional - Test helpers testImplementation("androidx.room:room-testing:$room_version") // optional - Paging 3 Integration implementation("androidx.room:room-paging:$room_version") }
Temel bileşenler
Odanın üç ana bileşeni vardır:
- Şu etiketi içeren veritabanı sınıfı: ve temel erişim noktası görevi görür. Böylece, uygulamanızın kalıcı verileri.
- Verileri temsil eden veri varlıkları tablolarda bulunmayı unutmayın.
- Veri erişim nesneleri (DAO'lar) Uygulamanızın sorgulamak, güncellemek, eklemek ve silmek için kullanabileceği yöntemler sağlar eklemesi gerekir.
Veritabanı sınıfı, uygulamanıza bu veritabanını kullanabilirsiniz. Buna karşılık uygulama, DAO'ları kullanarak veritabanını ilişkilendirilmiş veri varlığı nesnelerinin örnekleri olarak kabul eder. Uygulama ayrıca İlgili tablolardaki satırları güncellemek için tanımlanmış veri varlıklarını kullanabilir veya eklemek için yeni satırlar oluşturun. Şekil 1, Google ile İş Listesi’ndeki bileşenlerine ayıralım.
![](https://developer.android.google.cn/static/images/training/data-storage/room_architecture.png?authuser=19&hl=tr)
Örnek uygulama
Bu bölümde, ayrı bir e-posta adresi içeren tek bir veri varlığı ve tek bir DAO.
Veri varlığı
Aşağıdaki kod, bir User
veri varlığını tanımlar. Her bir User
örneği
, uygulamanın veritabanındaki user
tablosundaki bir satırı temsil eder.
Kotlin
@Entity data class User( @PrimaryKey val uid: Int, @ColumnInfo(name = "first_name") val firstName: String?, @ColumnInfo(name = "last_name") val lastName: String? )
Java
@Entity public class User { @PrimaryKey public int uid; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name") public String lastName; }
Odadaki veri varlıkları hakkında daha fazla bilgi edinmek için Odayı kullanarak veri tanımlama varlık.
Veri erişim nesnesi (DAO)
Aşağıdaki kod, UserDao
adlı bir DAO'yu tanımlar. UserDao
,
uygulamanın geri kalanının user
tablosundaki verilerle etkileşim kurmak için kullandığı yöntemler.
Kotlin
@Dao interface UserDao { @Query("SELECT * FROM user") fun getAll(): List<User> @Query("SELECT * FROM user WHERE uid IN (:userIds)") fun loadAllByIds(userIds: IntArray): List<User> @Query("SELECT * FROM user WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") fun findByName(first: String, last: String): User @Insert fun insertAll(vararg users: User) @Delete fun delete(user: User) }
Java
@Dao public interface UserDao { @Query("SELECT * FROM user") List<User> getAll(); @Query("SELECT * FROM user WHERE uid IN (:userIds)") List<User> loadAllByIds(int[] userIds); @Query("SELECT * FROM user WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") User findByName(String first, String last); @Insert void insertAll(User... users); @Delete void delete(User user); }
DAO'lar hakkında daha fazla bilgi edinmek için Odayı kullanarak verilere erişme DAO'lar.
Veritabanı
Aşağıdaki kod, veritabanını barındıracak bir AppDatabase
sınıfını tanımlar.
AppDatabase
, veritabanı yapılandırmasını tanımlar ve uygulamanın ana
kalıcı verilere buradan erişebilirsiniz. Veritabanı sınıfı
şu koşulları kabul etmelisiniz:
- Sınıfa
@Database
ek açıklamasıentities
içerir dizisidir. - Sınıf,
RoomDatabase
. - Veritabanıyla ilişkili her DAO sınıfı için veritabanı sınıfı sıfır bağımsız değişken içeren ve bir örnek döndüren soyut bir yöntem tanımlamalıdır seçmeniz gerekir.
Kotlin
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Java
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
Not: Uygulamanız tek bir işlemde çalışıyorsa aşağıdaki talimatları izlemelisiniz:
AppDatabase
örneklendirme sırasında tekil tasarım kalıbı
nesnesini tanımlayın. Her RoomDatabase
örneği oldukça pahalıdır ve
nadiren tek bir işlemde birden fazla örneğe erişim gerektirir.
Uygulamanız birden fazla işlemde çalışıyorsa
Veritabanı oluşturucunuzda enableMultiInstanceInvalidation()
çağrılacaktır. Bu şekilde, AppDatabase
örneğiniz olduğunda
paylaşılan veritabanı dosyasını tek işlemde geçersiz kılabilirsiniz.
ve bu geçersiz kılma işlemi otomatik olarak
Diğer işlemler içinde AppDatabase
.
Kullanım
Veri varlığını, DAO'yu ve veritabanı nesnesini tanımladıktan sonra, , veritabanının bir örneğini oluşturmak için aşağıdaki kodu kullanabilir:
Kotlin
val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build()
Java
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
Daha sonra örnek almak için AppDatabase
aracındaki soyut yöntemleri kullanabilirsiniz.
var. Buna karşılık, etkileşimde bulunmak için DAO örneğindeki
ile değiştirin:
Kotlin
val userDao = db.userDao() val users: List<User> = userDao.getAll()
Java
UserDao userDao = db.userDao(); List<User> users = userDao.getAll();
Ek kaynaklar
Oda hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara göz atın: