Room

Room - ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° Π½Π°Π΄ SQLIte/Realm/DAO, прСдставлСнная Π½Π° Goolge I/O. Room provides an abstraction layer over SQLite in a similar way to Retrofit with network requests. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования: androidx.room. https://habr.com/ru/post/336196/ https://developer.android.com/training/data-storage/room/accessing-data

Выглядит ΠΊΠ°ΠΊ достаточно бСзопасная ΡˆΡ‚ΡƒΠΊΠ°, которая ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ сразу Π² Π±Π°Π·Ρƒ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Если Π΄Π΅Π»Π°Ρ‚ΡŒ всС ΠΏΠΎ инструкции, ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (ΠΏΡ€ΠΎ sqli) ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ: https://medium.com/@appmattus/android-security-sql-injection-with-the-room-persistence-library-69f4e286960f

Π”Π²Π΅ Π½ΠΎΡ€ΠΌ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Room: https://medium.com/androiddevelopers/7-steps-to-room-27a5fe5f99b2 https://medium.com/androiddevelopers/7-pro-tips-for-room-fbadea4bfbd1

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

ΠŸΠΎΡΡ‚Π°ΠΏΠ½ΠΎΠ΅ созданиС https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/#4

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

Π’ build.gradle Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚Π°Ρ€ΠΈΠΉ google()

allprojects {
    repositories {
        jcenter()
        google()
    }
    ...
}

Π’ build.gradle Ρ„Π°ΠΉΠ»Π΅ модуля Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ dependencies:

dependencies {
    implementation "android.arch.persistence.room:runtime:1.0.0"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
    ...
}

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°

Π’Ρ€ΠΈ основных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° - Entity, Dao, Database Entity - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π±Π°Π·Π΅. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Database - Dao - описываСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ….

Entity

@Entity
public class Employee {

   @PrimaryKey
   public long id;

   public String name;

   public int salary;
}

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, имя создаваСмой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ класса. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ задаСтся своС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

@Entity(tableName = "employees")
public class Employee {
   // ...
}

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ имя поля:

@Entity()
public class Employee {
   @PrimaryKey()
   public long id;

   @ColumnInfo(name = "full_name")
   public String fullName;
   public int salary;
}

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Room опрСдСляСт Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… для поля Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ Π΄Π°Π½Π½Ρ‹Ρ… поля Π² Entity классС. Но ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свой Ρ‚ΠΈΠΏ.

@Entity()
public class Employee {

   @PrimaryKey(autoGenerate = true)
   public long id;
   public String name;

   @ColumnInfo(typeAffinity = TEXT)
   public int salary;
}

Π£ PrimaryKey Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ autoGenerate. Он позволяСт Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ для поля Ρ€Π΅ΠΆΠΈΠΌ autoincrement, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… сама Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Π²Ρ‹ Π΅Π³ΠΎ Π½Π΅ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ составной ΠΊΠ»ΡŽΡ‡, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ primaryKeys.

@Entity(primaryKeys = {"key1", "key2"})
public class Item {
   public long key1;
   public long key2;
   // ...
}

Π’Π½Π΅ΡˆΠ½ΠΈΠΉ ΠΊΠ»ΡŽΡ‡ (ForeignKeys) Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Если Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π½ΠΈΠΌΠΈ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ… Π² ΠΈΠ½Π΅Ρ‚Π΅. Π’ Π²Ρ‹ΡˆΠ΅ рассмотрСнных ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Ρƒ нас Π΅ΡΡ‚ΡŒ класс Employee для хранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сотрудникам. Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим класс Car для хранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ машинам. И каТдая машина Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π° ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ сотруднику.

Π’Π°ΠΆΠ½ΠΎ: When we use foreign key dont forget to put onDelete = ForeignKey.CASCADE this way if you delete an data it will also delete de dependency. This way you won't have false data or data that are never use

@Entity(foreignKeys = @ForeignKey(entity = Employee.class, parentColumns = "id", childColumns = "employee_id"))
public class Car {

   @PrimaryKey(autoGenerate = true)
   public long id;
   public String model;
   public int year;

   @ColumnInfo(name = "employee_id")
   public long employeeId;
}

ИндСкс (Index) Π˜Π½Π΄Π΅ΠΊΡΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ вашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Если Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Π½ΠΈΠΌΠΈ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ… Π² ΠΈΠ½Π΅Ρ‚Π΅. Π’ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Entity Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ indicies, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ индСксы.

@Entity(indices = {
               @Index("salary"),
               @Index(value = {"first_name", "last_name"})
           }
       )
public class Employee {
   @PrimaryKey(autoGenerate = true)
   public long id;

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

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

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π° индСкса: ΠΎΠ΄ΠΈΠ½ ΠΏΠΎ полю salary, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎ Π΄Π²ΡƒΠΌ полям first_name ΠΈ last_name.

ИндСкс для ΠΎΠ΄Π½ΠΎΠ³ΠΎ поля Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ настроСн Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ index Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ColumnInfo

@Entity()
public class Employee {

   @PrimaryKey(autoGenerate = true)
   public long id;
   public String name;

   @ColumnInfo(index = true)
   public int salary;
}

Π‘ΡƒΠ΄Π΅Ρ‚ создан индСкс для ΠΏΠΎΠ»Π΅ salary.

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠŸΡƒΡΡ‚ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ класс Address, с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎ адрСсС. Π­Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ класс, Π½Π΅ Entity.

public class Address {
   public String city;
   public String street;
   public int number;
}

И ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Entity классС Employee

@Entity()
public class Employee {
   @PrimaryKey(autoGenerate = true)
   public long id;
   public String name;
   public int salary;
   @Embedded
   public Address address;
}

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Embedded. Если Ρƒ вас получаСтся Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π° ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ΠΉ Π² основном ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΈ Π² Embedded ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ прСфикс для Embedded ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

@Embedded(prefix = "address")
public Address address;

Π’ этом случаС ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠΎΠ»Π΅ΠΉ Embedded ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ прСфикс.

Ignore Аннотация Ignore позволяСт ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Room, Ρ‡Ρ‚ΠΎ это ΠΏΠΎΠ»Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π² Π±Π°Π·Ρƒ ΠΈΠ»ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ· Π½Π΅Π΅.

@Entity
public class Employee {
   @PrimaryKey
   public long id;

   public String name;
   public int salary;

   @Ignore
   public Bitmap avatar;
}

Dao

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ employee. Напомню, Ρ‡Ρ‚ΠΎ имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ€Π°Π²Π½ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Entity класса, Ρ‚.Π΅. Employee, Π½ΠΎ Π² SQLite Π½Π΅ Π²Π°ΠΆΠ΅Π½ рСгистр Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ‚Π°Π±Π»ΠΈΡ†, поэтому ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ employee. Для вставки/обновлСния/удалСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ insert/update/delete с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ аннотациями. Π’ΡƒΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ запросы ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Названия ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌΠΈ. Π“Π»Π°Π²Π½ΠΎΠ΅ - Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ.

@Dao
public interface EmployeeDao {

   @Query("SELECT * FROM employee")
   List<Employee> getAll();

   @Query("SELECT * FROM employee WHERE id = :id")
   Employee getById(long id);

   @Insert
   void insert(Employee employee);

   @Update
   void update(Employee employee);

   @Delete
   void delete(Employee employee);

}

Database

АннотациСй Database ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅ΠΌ основной класс ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎΡ‚ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ абстрактным ΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ RoomDatabase.

@Database(entities = {Employee.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
   public abstract EmployeeDao employeeDao();
}

Π’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Database ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Entity Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΈ Π²Π΅Ρ€ΡΠΈΡŽ Π±Π°Π·Ρ‹. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Entity класса ΠΈΠ· списка entities Π±ΡƒΠ΄Π΅Ρ‚ создана Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π’ Database классС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для получСния Dao ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ понадобятся.

Как ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ

Database ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ - это стартовая Ρ‚ΠΎΡ‡ΠΊΠ°. Π•Π³ΠΎ созданиС выглядит Ρ‚Π°ΠΊ:

AppDatabase db =  Room.databaseBuilder(getApplicationContext(),
       AppDatabase.class, "database").build();

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Application Context, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ AppDatabase класс ΠΈ имя Ρ„Π°ΠΉΠ»Π° для Π±Π°Π·Ρ‹.

Π£Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ этого ΠΊΠΎΠ΄Π° Room ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр AppDatabase. Π­Ρ‚ΠΈ экзСмпляры ΠΎΡ‡Π΅Π½ΡŒ тяТСлыС ΠΈ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ экзСмпляр для всСх Π²Π°ΡˆΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ синглтонС для этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Dagger, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Если Π²Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Dagger (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ DI ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ), Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Application класс для создания ΠΈ хранСния AppDatabase:

public class App extends Application {

    public static App instance;

    private AppDatabase database;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        database = Room.databaseBuilder(this, AppDatabase.class, "database")
                .build();
    }

    public static App getInstance() {
        return instance;
    }

    public AppDatabase getDatabase() {
        return database;
    }
}

НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ App класс Π² манифСст

Π’ ΠΊΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±Π°Π·Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

AppDatabase db = App.getInstance().getDatabase();

Из Database ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Dao.

EmployeeDao employeeDao = db.employeeDao();

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Employee ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Но эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Π² UI ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π˜Π½Π°Ρ‡Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Exception.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ сотрудника Π² Π±Π°Π·Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Employee employee = new Employee();
employee.id = 1;
employee.name = "John Smith";
employee.salary = 10000;

employeeDao.insert(employee);

ΠœΠ΅Ρ‚ΠΎΠ΄ getAll Π²Π΅Ρ€Π½Π΅Ρ‚ Π½Π°ΠΌ всСх сотрудников Π² List

List<Employee> employees = employeeDao.getAll();

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сотрудника ΠΏΠΎ id:

Employee employee = employeeDao.getById(1);

UI ΠΏΠΎΡ‚ΠΎΠΊ

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… - синхронныС, ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Π² UI ΠΏΠΎΡ‚ΠΎΠΊΠ΅.

Π’ случаС с Query опСрациями ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… асинхронными ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ LiveData ΠΈΠ»ΠΈ RxJava.

Last updated