Oda varlıklarını kullanarak verileri tanımlama

Oda kalıcılığı kitaplığını kullanarak depoladığınızda uygulamanızın verilerini depolayıp kullanmak için kullandığınız nesneleri seçin. Her varlık, ilişkili Odadaki bir tabloya karşılık gelir temsil eder; bir varlığın her örneği, karşılık gelen tablodur.

Diğer bir deyişle, veritabanınızı tanımlamak için Oda varlıklarını kullanabilirsiniz hem de yazmalısınız.

Bir tüzel kişinin anatomisi

Her Oda varlığını @Entity. Oda varlığı şunları içerir: alanlar dahil olmak üzere, veri tabanında karşılık gelen tabloda yer alan her sütun için birincil anahtarı oluşturan daha fazla sütun bulunur.

Aşağıdaki kod, User tablosunu tanımlayan basit bir varlık örneğidir kimlik, ad ve soyadı sütunlarıyla:

Kotlin

@Entity
data class User(
    @PrimaryKey val id: Int,

    val firstName: String?,
    val lastName: String?
)

Java

@Entity
public class User {
    @PrimaryKey
    public int id;

    public String firstName;
    public String lastName;
}

Oda, varsayılan olarak veritabanı tablosu adı olarak sınıf adını kullanır. URL'nin tablonun farklı bir ada sahip olmasını istiyorsanız, tableName özelliği @Entity ek açıklaması. Oda, yine aynı şekilde alan adlarını varsayılan olarak ayarlanır. Bir sütunun farklı bir ada sahip olmasını istiyorsanız @ColumnInfo ek açıklamasını alanına girip name Aşağıdaki örnekte bir tablo ve sütunları için özel adlar gösterilmektedir:

Kotlin

@Entity(tableName = "users")
data class User (
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

Java

@Entity(tableName = "users")
public class User {
    @PrimaryKey
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

Birincil anahtar tanımlayın

Her Oda varlığı bir birincil anahtar tanımlamalıdır her bir satırı benzersiz şekilde tanımlayan bir anahtar kelime oluşturun. En Bunun en kolay yolu, aynı sütuna @PrimaryKey:

Kotlin

@PrimaryKey val id: Int

Java

@PrimaryKey
public int id;

Birleşik birincil anahtar tanımlayın

Bir varlık örneklerinin bir kombinasyon tarafından benzersiz şekilde birden çok sütun varsa bu sütunları listeleyerek birleşik birincil anahtar tanımlayabilirsiniz. primaryKeys özelliği: @Entity:

Kotlin

@Entity(primaryKeys = ["firstName", "lastName"])
data class User(
    val firstName: String?,
    val lastName: String?
)

Java

@Entity(primaryKeys = {"firstName", "lastName"})
public class User {
    public String firstName;
    public String lastName;
}

Alanları yoksay

Oda, varsayılan olarak varlıkta tanımlanan her alan için bir sütun oluşturur. Bir varlıkta tutmak istemediğiniz alanlar varsa bunlara not ekleyebilirsiniz @Ignore kullanılıyor. aşağıdaki kod snippet'inde gösterilmektedir:

Kotlin

@Entity
data class User(
    @PrimaryKey val id: Int,
    val firstName: String?,
    val lastName: String?,
    @Ignore val picture: Bitmap?
)

Java

@Entity
public class User {
    @PrimaryKey
    public int id;

    public String firstName;
    public String lastName;

    @Ignore
    Bitmap picture;
}

Bir varlığın, alanları bir üst varlıktan devraldığı durumlarda genellikle kullanımı daha kolay ignoredColumns özelliği @Entity özelliği:

Kotlin

open class User {
    var picture: Bitmap? = null
}

@Entity(ignoredColumns = ["picture"])
data class RemoteUser(
    @PrimaryKey val id: Int,
    val hasVpn: Boolean
) : User()

Java

@Entity(ignoredColumns = "picture")
public class RemoteUser extends User {
    @PrimaryKey
    public int id;

    public boolean hasVpn;
}

Oda, aramanızı kolaylaştıran çeşitli ek açıklama türlerini destekler inceleyebilirsiniz. Uygulamanız için geçerli olmayan minSdkVersion 16'dan küçük.

Tam metin araması desteği

Uygulamanız tam metin üzerinden veritabanı bilgilerine çok hızlı erişim gerektiriyorsa API'lerden birini kullanan sanal bir tabloyla desteklense de FTS3 veya FTS4 SQLite uzantısı modülünü inceleyin. Bu özelliği kullanmak için varsa, @Fts3 veya Belirli bir öğeye gösterilen @Fts4 ek açıklaması aşağıdaki kod snippet'inde:

Kotlin

// Use `@Fts3` only if your app has strict disk space requirements or if you
// require compatibility with an older SQLite version.
@Fts4
@Entity(tableName = "users")
data class User(
    /* Specifying a primary key for an FTS-table-backed entity is optional, but
       if you include one, it must use this type and column name. */
    @PrimaryKey @ColumnInfo(name = "rowid") val id: Int,
    @ColumnInfo(name = "first_name") val firstName: String?
)

Java

// Use `@Fts3` only if your app has strict disk space requirements or if you
// require compatibility with an older SQLite version.
@Fts4
@Entity(tableName = "users")
public class User {
    // Specifying a primary key for an FTS-table-backed entity is optional, but
    // if you include one, it must use this type and column name.
    @PrimaryKey
    @ColumnInfo(name = "rowid")
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;
}

Bir tablonun birden fazla dildeki içeriği desteklediği durumlarda Dil bilgilerinin depolandığı sütunu belirtmek için languageId seçeneği her satır:

Kotlin

@Fts4(languageId = "lid")
@Entity(tableName = "users")
data class User(
    // ...
    @ColumnInfo(name = "lid") val languageId: Int
)

Java

@Fts4(languageId = "lid")
@Entity(tableName = "users")
public class User {
    // ...

    @ColumnInfo(name = "lid")
    int languageId;
}

Oda, FTS destekli varlıkları tanımlamak için aşağıdakiler gibi çeşitli seçenekler sunar: ve harici içerik olarak yönetilen tablolar hakkında bilgi edinebilirsiniz. Örneğin, daha fazla ayrıntı için FtsOptions referansı.

Dizine özel sütunları

Uygulamanızın, FTS3 veya FTS4 tablo tabanlı varlıklarda, veritabanındaki belirli sütunları dizine eklemeye devam edebilirsiniz kullanabilirsiniz. Bir varlığa dizin eklemek için indices veya izin verilen @Entity ek açıklaması, sütun adlarını listeleyerek veya bileşik dizin. Aşağıdaki kod snippet'inde bu ek açıklama gösterilmektedir işlem:

Kotlin

@Entity(indices = [Index(value = ["last_name", "address"])])
data class User(
    @PrimaryKey val id: Int,
    val firstName: String?,
    val address: String?,
    @ColumnInfo(name = "last_name") val lastName: String?,
    @Ignore val picture: Bitmap?
)

Java

@Entity(indices = {@Index("name"),
        @Index(value = {"last_name", "address"})})
public class User {
    @PrimaryKey
    public int id;

    public String firstName;
    public String address;

    @ColumnInfo(name = "last_name")
    public String lastName;

    @Ignore
    Bitmap picture;
}

Bazı durumlarda, bir veritabanındaki belirli alanların veya alan gruplarının benzersiz olması gerekir. Bu benzersizlik özelliğini, unique @Index mülkü ek açıklama true öğesine eklendi. Aşağıdaki kod örneği, bir tabloda firstName ve için aynı değer grubunu içeren iki satır lastName sütun:

Kotlin

@Entity(indices = [Index(value = ["first_name", "last_name"],
        unique = true)])
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?,
    @Ignore var picture: Bitmap?
)

Java

@Entity(indices = {@Index(value = {"first_name", "last_name"},
        unique = true)})
public class User {
    @PrimaryKey
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;

    @Ignore
    Bitmap picture;
}

AutoValue'ya dayalı nesneleri dahil et

Oda 2.1.0 ve daha yüksek bir sürümde, Java tabanlı değişmez değer kullanabilirsiniz sınıflar, @AutoValue kullanarak açıklama eklersiniz. Bu bir varlığın iki örneği değerlendirildiğinde özellikle değerine eşit olmalıdır.

@AutoValue ek açıklamalı sınıfları varlık olarak kullandığınızda @PrimaryKey, @ColumnInfo, @Embedded ve etiketleri kullanan sınıfının soyut yöntemlerini @Relation. Ancak bu ek açıklamaları kullanırken Odanın yöntemleri yorumlayabilmesi için her seferinde @CopyAnnotations ek açıklaması doğru şekilde otomatik olarak oluşturduğunu gösterin.

Aşağıdaki kod snippet'inde Odanın varlık olarak tanıdığı @AutoValue:

User.Java

@AutoValue
@Entity
public abstract class User {
    // Supported annotations must include `@CopyAnnotations`.
    @CopyAnnotations
    @PrimaryKey
    public abstract long getId();

    public abstract String getFirstName();
    public abstract String getLastName();

    // Room uses this factory method to create User objects.
    public static User create(long id, String firstName, String lastName) {
        return new AutoValue_User(id, firstName, lastName);
    }
}