Database


@Target(allowedTargets = [AnnotationTarget.CLASS])
@Retention(value = AnnotationRetention.BINARY)
public annotation Database


Marks a class as a androidx.room.RoomDatabase.

The class should be an abstract class and extend androidx.room.RoomDatabase.

You can receive an implementation of the class via androidx.room.Room.databaseBuilder or androidx.room.Room.inMemoryDatabaseBuilder.

// Song and Album are classes annotated with @Entity.
@Database(version = 1, entities = [Song::class, Album::class])
abstract class MusicDatabase : RoomDatabase {
// SongDao is a class annotated with @Dao.
abstract fun getSongDao(): SongDao

// AlbumDao is a class annotated with @Dao.
abstract fun getArtistDao(): ArtistDao

// SongAlbumDao is a class annotated with @Dao.
abstract fun getSongAlbumDao(): SongAlbumDao
}

The example above defines a class that has 2 tables and 3 DAO classes that are used to access it. There is no limit on the number of Entity or Dao classes but they must be unique within the Database.

Instead of running queries on the database directly, you are highly recommended to create Dao classes. Using Dao classes will allow you to abstract the database communication in a more logical layer which will be much easier to mock in tests (compared to running direct SQL queries). It also automatically does the conversion from Cursor to your application data classes so you don't need to deal with lower level database APIs for most of your data access.

Room also verifies all of your queries in Dao classes while the application is being compiled so that if there is a problem in one of the queries, you will be notified instantly.

To automatically generate a migration between two versions of the database, assuming you have the relevant schema files, you are recommended to use AutoMigration annotations. Note that if an autoMigration is defined in a database, exportSchema must be true.

Summary

Public constructors

Database(
    @NonNull KClass[] entities,
    @NonNull KClass[] views,
    int version,
    boolean exportSchema,
    @NonNull AutoMigration[] autoMigrations
)

Public methods

final @NonNull AutoMigration[]

List of AutoMigrations that can be performed on this Database.

final @NonNull KClass[]

The list of entities included in the database.

final boolean

You can set the annotation processor argument (room.schemaLocation) to tell Room to export the database schema into a folder.

final int

The database version.

final @NonNull KClass[]

The list of database views included in the database.

Public constructors

Database

public Database(
    @NonNull KClass[] entities,
    @NonNull KClass[] views,
    int version,
    boolean exportSchema,
    @NonNull AutoMigration[] autoMigrations
)

Public methods

getAutoMigrations

public final @NonNull AutoMigration[] getAutoMigrations()

List of AutoMigrations that can be performed on this Database.

See AutoMigration for example code usage.

For more complicated cases not covered by AutoMigration, runtime defined androidx.room.migration.Migration added with androidx.room.RoomDatabase.Builder.addMigrations can still be used.

Returns
@NonNull AutoMigration[]

List of AutoMigration annotations.

getEntities

public final @NonNull KClass[] getEntities()

The list of entities included in the database. Each entity turns into a table in the database.

Returns
@NonNull KClass[]

The list of entities in the database.

getExportSchema

public final boolean getExportSchema()

You can set the annotation processor argument (room.schemaLocation) to tell Room to export the database schema into a folder. Even though it is not mandatory, it is a good practice to have version history of your schema in your codebase and you should commit the schema files into your version control system (but don't ship them with your app!).

When room.schemaLocation is set, Room will check this variable and if it is set to true, the database schema will be exported into the given folder.

Value of exportSchema is true by default but you can disable it for databases when you don't want to keep history of versions (like an in-memory only database).

Returns
boolean

Whether the schema should be exported to the given folder when the room.schemaLocation argument is set. Defaults to true.

getVersion

public final int getVersion()

The database version.

Returns
int

The database version.

getViews

public final @NonNull KClass[] getViews()

The list of database views included in the database. Each class turns into a view in the database.

Returns
@NonNull KClass[]

The list of database views.