티스토리 뷰
반응형
Room 은 메인쓰레드에서 db 의 접근을 허용하지 않는다. 허용하려면 allowMainThreadQueries() 를 호출하면 되지만 권장하지 않는다. 그래서 LiveData, AsyncTask, RxJava 를 함께 사용해야 한다.
1편에서는 AsyncTask 를 이용한 Room 사용방법을 알아보겠다.
Cart
@Entity(tableName = "cart.db")
public class Cart {
@PrimaryKey(autoGenerate = true)
public int uid;
@ColumnInfo(name = "id")
public int id;
@ColumnInfo(name = "name")
public String name;
@ColumnInfo(name = "price")
public int price;
@ColumnInfo(name = "number")
public int number;
@ColumnInfo(name = "sum")
public int sum;
public Cart(int id, String name, int price, int number, int sum) {
this.id = id;
this.name = name;
this.price = price;
this.number = number;
this.sum = sum;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
}
CartDao
@Dao
public interface CartDAO {
//db 의 모든 데이터 가져오기.
@Query("SELECT * FROM cart_db")
List<Cart> getListCart();
//itemId, itemPrice 둘 다 존재하면 true. 아니라면 false .
@Query("SELECT EXISTS (SELECT * FROM cart_db WHERE id=:itemId AND price=:itemPrice)")
Boolean getExists(int itemId, int itemPrice);
//itemId, itemPrice 둘 다 만족하면 number 와 sum 업데이트.
@Query("UPDATE cart_db SET number = number + 1, sum = (number + 1) * price WHERE id=:itemId AND price=:itemPrice")
void updateCartNumber(int itemId, int itemPrice);
//db 의 모든 데이터 삭제.
@Query("DELETE FROM cart_db")
void deleteCart();
}
CartDatabase
@Database(entities = {Cart.class}, version = 1)
public abstract class CartDatabase extends RoomDatabase {
public abstract CartDAO cartDAO();
public static CartDatabase INSTANCE;
public static CartDatabase getCartDatabase(Context context) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context, CartDatabase.class, "cart_db").build();
}
return INSTANCE;
}
}
CartRepository
public class CartRepository {
private CartDAO cartDAO;
public CartRepository(Context context) {
CartDatabase db = CartDatabase.getCartDatabase(context);
cartDAO = db.cartDAO();
}
//select all !
public List<Cart> getListCart() {
try {
return new CartRepository.getListCartAsyncTask(cartDAO).execute().get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
return null;
}
}
private static class getListCartAsyncTask extends AsyncTask<Void, Void, List<Cart>> {
private CartDAO mAsyncTaskDao;
getListCartAsyncTask(CartDAO cartDAO) {
mAsyncTaskDao = cartDAO;
}
@Override
protected List<Cart> doInBackground(Void... voids) {
return mAsyncTaskDao.getListCart();
}
}
//select !
public Boolean getExists(int itemId, int itemPrice) {
try {
return new getExistsAsyncTask(cartDAO).execute(itemId, itemPrice).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
return null;
}
}
private static class getExistsAsyncTask extends AsyncTask<Integer, Void, Boolean> {
private CartDAO mAsyncTaskDao;
getExistsAsyncTask(CartDAO cartDAO) {
mAsyncTaskDao = cartDAO;
}
@Override
protected Boolean doInBackground(Integer... integers) {
return mAsyncTaskDao.getExists(integers[0], integers[1]);
}
}
//update !
public void updateCartNumber(int itemId, int itemPrice) {
new updateCartNumberAsyncTask(cartDAO).execute(itemId, itemPrice);
}
private static class updateCartNumberAsyncTask extends AsyncTask<Integer, Void, Void> {
private CartDAO mAsyncTaskDao;
updateCartNumberAsyncTask(CartDAO cartDAO) {
mAsyncTaskDao = cartDAO;
}
@Override
protected Void doInBackground(Integer... integers) {
mAsyncTaskDao.updateCartNumber(integers[0], integers[1]);
return null;
}
}
//delete !
public void deleteCart() {
new deleteCartAsyncTask(cartDAO).execute();
}
private static class deleteCartAsyncTask extends AsyncTask<Void, Void, Void> {
private CartDAO mAsyncTaskDao;
deleteCartAsyncTask(CartDAO cartDAO) {
mAsyncTaskDao = cartDAO;
}
@Override
protected Void doInBackground(Void... voids) {
mAsyncTaskDao.deleteCart();
return null;
}
}
}
MainActivity
private void getCart() {
CartRepository cartRepository = new CartRepository(getApplication());
//db 나 server 에서 값을 가져온 후 사용하면 된다.
cartRepository.getListCart();
cartRepository.getExists(id, price);
cartRepository.updateCartNumber(id, price);
cartRepository.deleteCart();
}
반응형
'Android' 카테고리의 다른 글
DeepLink(1부) (0) | 2022.03.11 |
---|---|
RxJava (Subject, PublishSubject, BehaviorSubject) (0) | 2020.12.02 |
[Android] Retrofit2 POST 방법(@Part, @Field, @Body, @Multipart, @FormUrlEncoded) (0) | 2020.11.25 |
[Android] 이미지 슬라이드 + Retrofit2 (AdapterViewFlipper) (0) | 2020.11.25 |
Collection Framework (0) | 2020.11.25 |
댓글