티스토리 뷰

반응형

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();
}
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함
반응형