/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Room is a Database Object Mapping library that makes it easy to access database on Android * applications. *
* Rather than hiding the details of SQLite, Room tries to embrace them by providing convenient APIs * to query the database and also verify such queries at compile time. This allows you to access * the full power of SQLite while having the type safety provided by Java SQL query builders. *
* There are 3 major components in Room. *
* The database class defines the list of entities and data access objects in the database. * It is also the main access point for the underlying connection. *
* Using Dao classes for database access rather than query builders or direct queries allows you * to keep a separation between different components and easily mock the database access while * testing your application. *
* // File: Song.java
* {@literal @}Entity
* public class User {
* {@literal @}PrimaryKey
* private int id;
* private String name;
* {@literal @}ColumnInfo(name = "release_year")
* private int releaseYear;
* // getters and setters are ignored for brevity but they are required for Room to work.
* }
* // File: SongDao.java
* {@literal @}Dao
* public interface SongDao {
* {@literal @}Query("SELECT * FROM song")
* List<Song> loadAll();
* {@literal @}Query("SELECT * FROM song WHERE id IN (:songIds)")
* List<Song> loadAllBySongId(int... songIds);
* {@literal @}Query("SELECT * FROM song WHERE name LIKE :name AND release_year = :year LIMIT 1")
* Song loadOneByNameAndReleaseYear(String first, int year);
* {@literal @}Insert
* void insertAll(Song... songs);
* {@literal @}Delete
* void delete(Song song);
* }
* // File: MusicDatabase.java
* {@literal @}Database(entities = {Song.java})
* public abstract class MusicDatabase extends RoomDatabase {
* public abstract SongDao userDao();
* }
*
* You can create an instance of {@code MusicDatabase} as follows:
* * MusicDatabase db = Room * .databaseBuilder(getApplicationContext(), MusicDatabase.class, "database-name") * .build(); ** Since Room verifies your queries at compile time, it also detects information about which tables * are accessed by the query or what columns are present in the response. *
* You can observe a particular table for changes using the * {@link androidx.room.InvalidationTracker InvalidationTracker} class which you can acquire via * {@link androidx.room.RoomDatabase#getInvalidationTracker() * RoomDatabase.getInvalidationTracker}. *
* For convenience, Room allows you to return {@link androidx.lifecycle.LiveData LiveData} from * {@link androidx.room.Query Query} methods. It will automatically observe the related tables as * long as the {@code LiveData} has active observers. *
* // This live data will automatically dispatch changes as the database changes.
* {@literal @}Query("SELECT * FROM song ORDER BY name LIMIT 5")
* LiveData<Song> loadFirstFiveSongs();
*
* * You can also return arbitrary data objects from your query results as long as the fields in the * object match the list of columns in the query response. This makes it very easy to write * applications that drive the UI from persistent storage. *
* class IdAndSongHeader {
* int id;
* {@literal @}ColumnInfo(name = "header")
* String header;
* }
* // DAO
* {@literal @}Query("SELECT id, name || '-' || release_year AS header FROM user")
* public IdAndSongHeader[] loadSongHeaders();
*
* If there is a mismatch between the query result and the POJO, Room will print a warning during
* compilation.
* * Please see the documentation of individual classes for details. */ package androidx.room;