Сохраните данные в локальной базе данных с помощью Room Part Android Jetpack .

Приложения, которые обрабатывают нетривиальные объемы структурированных данных, могут получить большую выгоду от локального сохранения этих данных. Наиболее распространенным вариантом использования является кэширование соответствующих фрагментов данных, чтобы, когда устройство не может получить доступ к сети, пользователь все равно мог просматривать этот контент, находясь в автономном режиме.

Библиотека персистентности Room предоставляет уровень абстракции поверх SQLite, обеспечивающий свободный доступ к базе данных, используя при этом всю мощь SQLite. В частности, Room предоставляет следующие преимущества:

  • Проверка SQL-запросов во время компиляции.
  • Удобные аннотации, которые минимизируют повторяющийся и подверженный ошибкам шаблонный код.
  • Оптимизированные пути миграции базы данных.

По этим соображениям мы настоятельно рекомендуем вам использовать Room вместо прямого использования API SQLite .

Настраивать

Чтобы использовать Room в своем приложении, добавьте следующие зависимости в файл build.gradle вашего приложения.

KotlinGroovy
dependencies {
    val room_version = "2.6.1"

    implementation("androidx.room:room-runtime:$room_version")

    // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
    // See Add the KSP plugin to your project
    ksp("androidx.room:room-compiler:$room_version")

    // If this project only uses Java source, use the Java annotationProcessor
    // No additional plugins are necessary
    annotationProcessor("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")
}
dependencies {
    def room_version = "2.6.1"

    implementation "androidx.room:room-runtime:$room_version"

    // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
    // See KSP Quickstart to add KSP to your build
    ksp "androidx.room:room-compiler:$room_version"

    // If this project only uses Java source, use the Java annotationProcessor
    // No additional plugins are necessary
    annotationProcessor "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"
}

Основные компоненты

В Room есть три основных компонента:

  • Класс базы данных , который содержит базу данных и служит основной точкой доступа для базового подключения к постоянным данным вашего приложения.
  • Объекты данных , представляющие таблицы в базе данных вашего приложения.
  • Объекты доступа к данным (DAO), которые предоставляют методы, которые ваше приложение может использовать для запроса, обновления, вставки и удаления данных в базе данных.

Класс базы данных предоставляет вашему приложению экземпляры DAO, связанные с этой базой данных. В свою очередь, приложение может использовать DAO для извлечения данных из базы данных в виде экземпляров связанных объектов объектов данных. Приложение также может использовать определенные объекты данных для обновления строк из соответствующих таблиц или для создания новых строк для вставки. Рисунок 1 иллюстрирует взаимосвязь между различными компонентами Room.

Рисунок 1. Схема архитектуры библиотеки Room.

Пример реализации

В этом разделе представлен пример реализации базы данных Room с одним объектом данных и одним DAO.

Сущность данных

Следующий код определяет объект данных User . Каждый экземпляр User представляет строку в таблице user в базе данных приложения.

@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)
@Entity
public class User {
    @PrimaryKey
    public int uid;

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

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

Дополнительные сведения об объектах данных в Room см. в разделе Определение данных с помощью объектов Room .

Объект доступа к данным (DAO)

Следующий код определяет DAO под названием UserDao . UserDao предоставляет методы, которые остальная часть приложения использует для взаимодействия с данными в user таблице.

@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)
}
@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 см. в разделе Доступ к данным с помощью Room DAO .

База данных

Следующий код определяет класс AppDatabase для хранения базы данных. AppDatabase определяет конфигурацию базы данных и служит основной точкой доступа приложения к сохраненным данным. Класс базы данных должен удовлетворять следующим условиям:

  • Класс должен быть помечен аннотацией @Database , которая включает массив entities , в котором перечислены все объекты данных, связанные с базой данных.
  • Класс должен быть абстрактным классом, расширяющим RoomDatabase .
  • Для каждого класса DAO, связанного с базой данных, класс базы данных должен определить абстрактный метод, который не имеет аргументов и возвращает экземпляр класса DAO.
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

Примечание. Если ваше приложение выполняется в одном процессе, вам следует следовать шаблону проектирования Singleton при создании экземпляра объекта AppDatabase . Каждый экземпляр RoomDatabase довольно дорог, и вам редко требуется доступ к нескольким экземплярам в рамках одного процесса.

Если ваше приложение работает в нескольких процессах, включите enableMultiInstanceInvalidation() в вызов построителя базы данных. Таким образом, если у вас есть экземпляр AppDatabase в каждом процессе, вы можете сделать недействительным общий файл базы данных в одном процессе, и это признание недействительным автоматически распространяется на экземпляры AppDatabase в других процессах.

Использование

После того как вы определили объект данных, DAO и объект базы данных, вы можете использовать следующий код для создания экземпляра базы данных:

val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "database-name").build();

Затем вы можете использовать абстрактные методы из AppDatabase чтобы получить экземпляр DAO. В свою очередь, вы можете использовать методы экземпляра DAO для взаимодействия с базой данных:

val userDao = db.userDao()
val users: List<User> = userDao.getAll()
UserDao userDao = db.userDao();
List<User> users = userDao.getAll();

Дополнительные ресурсы

Чтобы узнать больше о Room, см. следующие дополнительные ресурсы:

Образцы

Mir 2: Return of the King 是 Actoz Soft 授权的优质《传奇》IP 移动游戏,由 HK ZHILI YAOAN LIMITED 使用 Unity 游戏引擎开发。 这款游戏不仅完美再现了韩国奇幻类 MMORPG 的代表作 Mir 2 的游戏氛围,还提供了许多最受欢迎的游戏内容,例如装备收集、大规模沙漠攻击和其他核心玩法。 该游戏使用了 Android Frame Pacing 库 (Swappy) 来提高帧速率的稳定性、实现流畅的渲染,并显著提升了 Android

鸣潮 是一款由 Kuro Games 开发的高保真动作角色扮演游戏。为了持续为长时间的游戏会话提供卓越的用户体验,优化功耗非常重要。 Android Studio 从 Hedgehog (2023.1.1) 开始引入了 功耗性能分析器 ,可帮助开发者根据设备端电源轨监视器 (ODPM) 了解功耗数据。 借助 Android Studio 中的功耗性能分析功能,您还可以 有效地对 Android 应用功能的功耗进行 A/B 测试 (如下所示)。 Kuro Games 首先使用 Android

Godot Engine 是一个广受欢迎的多平台开源游戏引擎,对 Android 提供强大的支持。Godot 可用于制作几乎任何类型的游戏,并且支持 2D 和 3D 图形。Godot 4 版引入了新的渲染系统,该系统具有用于高保真图形的高级功能。Godot 4 渲染程序专为 Vulkan 等现代图形 API 而设计。 Godot Foundation 聘请了 The Forge Interactive 的图形优化专家,并与 Google 合作分析和进一步改进了 Godot 4 Vulkan

Кодлабы

Блоги