샘플은 구글
샘플 내용 요약
- 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()
}
}
```