Escriu per cercar…

Entitat

Explorem la resta de la configuració per a entitats i DAO

Introducció

Els únics requisits absoluts per a una classe d’entitat de Room és que estigui anotada amb l’anotació @Entity i tingui un camp identificat com a clau primària, típicament mitjançant una anotació @PrimaryKey. Qualsevol cosa més enllà d’això és opcional.

No obstant això, hi ha força coses que van “més enllà d’això”. Algunes — encara que probablement no totes — d’aquestes característiques són d’interès en aplicacions més grans.

Crea un projecte room-entity.

Claus primàries

Si tens un sol camp que és la clau primària per a la teva entitat, utilitzar l’anotació @PrimaryKey és simple i t’ajuda a identificar clarament aquesta clau primària en un punt posterior.

No obstant això, tens algunes altres opcions.

Claus primàries autogenerades

A SQLite, si tens una columna INTEGER identificada com a PRIMARY KEY, pots opcionalment fer que SQLite assigni valors únics per a aquesta columna, mitjançant la paraula clau AUTOINCREMENT.

A Room, si tens una propietat Long que és la teva @PrimaryKey, pots aplicar opcionalment AUTOINCREMENT a la columna corresponent afegint autoGenerate=true a l’anotació:

kotlin
@Entity(tableName = "Party")
data class Message(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,
    val text: String,
) {
    @Dao
    interface SQL {
        @Query("SELECT * FROM Party")
        suspend fun select(): List<Message>

        @Query("SELECT * FROM Party WHERE id = :id")
        suspend fun selectWhereId(id: Long): Message?

        @Insert
        suspend fun insert(autoGenerate: Message): Long
    }
}

@androidx.room.Database(entities = [Message::class], version = 1)
abstract class Database : RoomDatabase() {
    abstract fun message(): Message.SQL
}

Per defecte, autoGenerate és false. Establir aquesta propietat a true et dona AUTOINCREMENT a la instrucció CREATE TABLE generada:

sql
CREATE TABLE IF NOT EXISTS Message (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, text TEXT NOT NULL)

Els mètodes Insert tracten 0 (o null) com a no-establert mentre s’insereix l’element.

No coneixes la teva clau primària fins que insereixis l’entitat a una base de dades. Les teves funcions anotades amb @Insert poden retornar un resultat Long, i aquest serà la clau primària per a aquella entitat inserida.

kotlin
val db = Room.inMemoryDatabaseBuilder<Database>().setDriver(BundledSQLiteDriver()).build()

db.message().select() shouldBe emptyList()

val id = db.message().insert(Message(text = "Hello World"))
id shouldBe 1L

db.message().selectWhereId(1L)!!.let {
    it.id.shouldBe(1L);
    it.text shouldBe "Hello World"
}

UUID com a clau primària

Encara que una UUID ocupa molt més espai que un simple Long, poden ser generats de manera única fora de la base de dades.

Els Identificadors Únics Universals són números de 128 bits que sovint s’utilitzen com a identificadors de base de dades o de sessió. L’avantatge és que poden ser generats independentment en qualsevol lloc, amb una probabilitat extremadament baixa de generar el mateix ID dues vegades.

Això significa que pots crear aquests IDs i assignar-los a elements al costat del client en molts dispositius diferents, sense haver de sincronitzar constantment amb un servidor que et digui quin hauria de ser el pròxim ID.

Modifica la secció settings del fitxer module.yaml:

yaml
settings:
  kotlin:
    ksp:
      processors:
        - androidx.room:room-compiler:2.8.3
    optIns: [ kotlin.uuid.ExperimentalUuidApi ]

Estàs llegint una vista prèvia.

Inicia sessió per llegir l'article complet. Qualsevol compte obre 4 articles gratuïts al mes; l'alumnat i el professorat llegeixen les pàgines del seu curs sense límit.

Inicia sessió