Jetpack 사용을 위한 기초 공부 AAC(Room)

샘플은 구글

샘플 내용 요약

  • sunflower, 구글 AAC 샘플을 적용하기전 기초지식 부터
  • 짧은 샘플이지만 기본적인 내용부터 알아야 가능

라이브데이터

  • 기존 데이터를 DB 에 넣어 오프라인에서도 기존데이터는 볼수 있도록 하자
  • 항상 최신데이터가 필요 할 수도 있지만 예전 데이터라도 보고 싶을때가 있다.

기초 지식 1: ROOM

  • 라이브 데이터를 사용하기 위해서 기초인 room
  • 일반적인 DB 에서는 테이블을 만들어 사용하지만 room 은 orm 형태로 클래스를 만들어 사용한다.
  • 아래와 같이 테이블을 만들어 사용 해야 한다.

create table Items( id int NOT NULL, name varchar(255) NOT NULL, description varchar(255), price int, PRIMARY KEY (id) )

  • Room 의 Entity 형태로 변경하면 아래와 같이 클래스 선언후 필요한 어노테이션을 추가하면 된다.
  • 참고내용으로 실제 적용 할때는 찾아서 하는게 좋습니다.
    • 어노테이션들
      • @Entity(primaryKeys = {“firstName”, “lastName”}) : 복합키
      • @ColumnInfo(name = “first_name”)String firstName : 객체 필드명과 실제 테이블 필드명이 다를 때의 처리
      • @Ignore Bitmap picture : 무시할 객체의 필드
      • @Entity(indices = {@Index(“name”), @Index(value = {“last_name”, “address”})}) : 인덱스설정
      • @Entity(foreignKeys = @ForeignKey(entity = User.class, parentColumns = “id”, childColumns = “user_id”)) : 외래키 설정
      • @Embedded OtherEntity data : 중첩엔티티로 표현하기

@Entity(tableName = "Items") data class ItemEntity( @PrimaryKey val id:Int, val name:String , val description:String, val price:Int )

DAO : 쿼리 인터페이스

  • Room 전체 적인 DB 개념이니 데이터의 추가 삭제를 담당 하는 인터페이스
  • SQLite3 를 사용하기에 쿼리문을 직접 사용하거나 제공 되는 어노테이션을 사용하면 된다.
  • 아래는 오너테이션 사용 관련 자바 입니다. 공부하는 코드가 자바라

``` // 예제 1 @Dao public interface MyDao { @Query(“SELECT * FROM user”) public User[] loadAllUsers(); }

// 예제 2 @Dao public interface MyDao { @Delete public void deleteUsers(User… users); }

// 예제 2 @Dao public interface MyDao { @Update public void updateUsers(User… users); }

// 예제 3 @Dao public interface MyDao { @Insert(onConflict = OnConflictStrategy.REPLACE) public void insertUsers(User… users);

  @Insert
  public void insertBothUsers(User user1, User user2);
  
  @Insert
  public void insertUsersAndFriends(User user, List<User> friends);   }   ``` 

엔터티, DAO 를 이용한 데이터베이스 생성

  • 빌더 패턴이 적용된 데이터 베이스
  • 여기 까지는 기본적인 내용으로 실제 적용은 다른 포스트에서…

``` @Database(entities = arrayOf(User::class), version = 1) abstract class UsersDatabase : RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {

        @Volatile private var INSTANCE: UsersDatabase? = null

        fun getInstance(context: Context): UsersDatabase =
                INSTANCE ?: synchronized(this) {
                    INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
                }

        private fun buildDatabase(context: Context) =
                Room.databaseBuilder(context.applicationContext,
                        UsersDatabase::class.java, "Sample.db")
                        .build()
    }
}

```

PyeongHo

즐겁게 또 즐겁게