본문 바로가기
프로그래밍/Android

(Android) Room Persistence Library(Room Database)

by LiveData 2018. 12. 21.
반응형

Room Database는 내장된 SQLite 기능을 활용하여
데이터베이스를 사용할 수 있습니다.
(※SQLite - 안드로이드 운영체제에 기본으로 탑재되어있는 데이터베이스, 비교적 가벼움)

Room의 주요 3가지 구성요소

· Database(데이터베이스) - 데이터베이스의 holder를 구성하며 관계형 데이터에 대한 연결을 해준다.
조건 -  1. RoomDatabase를 extends 하는 abstract class입니다.
           2. annotation 내에 entities(Table의 구조와 mapping되는 class)를 포함해야 한다.
           3. 클래스 내부에 DAO(Data Access Objects)를 정의한다.

 ·  Entity(엔티티) - 데이터베이스 내의 테이블을 나타낸다. 
 ·  DAO(Data Access Objects)데이터베이스에 접근하는 데 사용되는 함수를 정의


Entity 예시

@Entity(tableName="user")
public class User {
    @PrimaryKey
    @NonNull
    private String uid;
 
    @ColumnInfo(name="first_name")
    private String firstName;
 
    @ColumnInfo(name="last_name")
    private String lastName;
 
    //생성자, getter와 setter은 필수적인 요소입니다.
    //getter와 setter은 없을시 
 
    public User(String firstName, String lastName) {
        this.uid= UUID.randomUUID().toString();
        this.firstName = firstName;
        this.lastName = lastName;
    }
 
    @NonNull
    public String getUid() {
        return uid;
    }
 
    public void setUid(@NonNull String uid) {
        this.uid = uid;
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}
cs

Dao 예시
@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);
}
cs

Database 예시
@Database(entities={User.class}, version=1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
 
    //Room Database는 싱글톤 패턴을 해야한다.
    private static AppDatabase INSTANCE;
 
    private static final Object sLock = new Object();
 
    public static AppDatabase getInstance(Context context) {
        synchronized (sLock) {
            if(INSTANCE==null) {
                INSTANCE=Room.databaseBuilder(context.getApplicationContext(),
                        AppDatabase.class"Users.db")
                        .build();
            }
            return INSTANCE;
        }
    }
}
cs
AppDatabase object를 생성하는 코드는 비용이 많이 들기 때문에 singleton으로 구현해야 합니다.
다음시간에는 실제 Room Database 사용 예시를 만들어보면서 원리를 공부해봅시다.
사용하게 될 open source는 아래와 같습니다.

영어로 되어있지만 단계별로 잘 설명이 되어있습니다.

반응형