Android Room에서 엔티티의 특정 필드 업데이트
새 프로젝트에 Android 룸 지속성 라이브러리를 사용하고 있습니다. 테이블의 일부 필드를 업데이트하고 싶습니다. 나는 내 Dao
-
// Method 1:
@Dao
public interface TourDao {
@Update
int updateTour(Tour tour);
}
그러나이 방법을 사용하여 업데이트하려고하면 둘러보기 개체의 기본 키 값과 일치하는 엔티티의 모든 필드를 업데이트합니다. 나는 사용했다@Query
// Method 2:
@Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid")
int updateTour(long tid, String end_address);
작동하지만 엔터티에 많은 필드가 있기 때문에 제 경우에는 많은 쿼리가 있습니다. Method 1
id = 1 인 경우 와 같이 일부 필드 (전부는 아님)를 어떻게 업데이트 할 수 있는지 알고 싶습니다 . (id는 자동 생성 기본 키입니다).
// Entity:
@Entity
public class Tour {
@PrimaryKey(autoGenerate = true)
public long id;
private String startAddress;
private String endAddress;
//constructor, getter and setter
}
id = 1 인 방법 1과 같은 일부 필드 (전부는 아님)를 어떻게 업데이트 할 수 있는지 알고 싶습니다.
@Query
방법 2에서와 같이를 사용하십시오 .
내 엔터티에 많은 필드가 있기 때문에 내 경우에는 쿼리가 너무 길다.
그런 다음 더 작은 개체가 있습니다. 또는 필드를 개별적으로 업데이트하지 말고 대신 데이터베이스와보다 대략적으로 상호 작용하십시오.
IOW, Room 자체에는 원하는 것을 수행 할 수있는 것이 없습니다.
SQLite 업데이트 문서 에 따르면 :
<!-- language: lang-java -->
@Query("UPDATE tableName SET
field1 = :value1,
field2 = :value2,
...
//some more fields to update
...
field_N= :value_N
WHERE id = :id)
int updateTour(long id,
Type value1,
Type value2,
... ,
// some more values here
... ,
Type value_N);
예:
실재:
@Entity(tableName = "orders")
public class Order {
@NonNull
@PrimaryKey
@ColumnInfo(name = "order_id")
private int id;
@ColumnInfo(name = "order_title")
private String title;
@ColumnInfo(name = "order_amount")
private Float amount;
@ColumnInfo(name = "order_price")
private Float price;
@ColumnInfo(name = "order_desc")
private String description;
// ... methods, getters, setters
}
Dao :
@Dao
public interface OrderDao {
@Query("SELECT * FROM orders")
List<Order> getOrderList();
@Query("SELECT * FROM orders")
LiveData<List<Order>> getOrderLiveList();
@Query("SELECT * FROM orders WHERE order_id =:orderId")
LiveData<Order> getLiveOrderById(int orderId);
/**
* Updating only price
* By order id
*/
@Query("UPDATE orders SET order_price=:price WHERE order_id = :id")
void update(Float price, int id);
/**
* Updating only amount and price
* By order id
*/
@Query("UPDATE orders SET order_amount = :amount, price = :price WHERE order_id =:id")
void update(Float amount, Float price, int id);
/**
* Updating only title and description
* By order id
*/
@Query("UPDATE orders SET order_desc = :description, order_title= :title WHERE order_id =:id")
void update(String description, String title, int id);
@Update
void update(Order order);
@Delete
void delete(Order order);
@Insert(onConflict = REPLACE)
void insert(Order order);
}
시도해 볼 수 있지만 성능이 약간 (또는 그 이상) 나빠질 것입니다.
@Dao
public abstract class TourDao {
@Query("SELECT * FROM Tour WHERE id == :id")
public abstract Tour getTour(int id);
@Update
public abstract int updateTour(Tour tour);
public void updateTour(int id, String end_address) {
Tour tour = getTour(id);
tour.end_address = end_address;
updateTour(tour);
}
}
특정 사용자 ID "x"에 대한 사용자 정보를 업데이트해야하는 경우,
- 생성자에서 데이터베이스를 초기화하고 viewModel과 DAO 사이의 중개자 역할을 하는 dbManager 클래스 를 만들어야합니다 .
뷰 모델은 데이터베이스에 액세스 할 dbManager의 인스턴스를 초기화합니다. 코드는 다음과 같아야합니다.
@Entity class User{ @PrimaryKey String userId; String username; } Interface UserDao{ //forUpdate @Update void updateUser(User user) } Class DbManager{ //AppDatabase gets the static object o roomDatabase. AppDatabase appDatabase; UserDao userDao; public DbManager(Application application ){ appDatabase = AppDatabase.getInstance(application); //getUserDao is and abstract method of type UserDao declared in AppDatabase //class userDao = appDatabase.getUserDao(); } public void updateUser(User user, boolean isUpdate){ new InsertUpdateUserAsyncTask(userDao,isUpdate).execute(user); } public static class InsertUpdateUserAsyncTask extends AsyncTask<User, Void, Void> { private UserDao userDAO; private boolean isInsert; public InsertUpdateBrandAsyncTask(BrandDAO userDAO, boolean isInsert) { this. userDAO = userDAO; this.isInsert = isInsert; } @Override protected Void doInBackground(User... users) { if (isInsert) userDAO.insertBrand(brandEntities[0]); else //for update userDAO.updateBrand(users[0]); //try { // Thread.sleep(1000); //} catch (InterruptedException e) { // e.printStackTrace(); //} return null; } } } Class UserViewModel{ DbManager dbManager; public UserViewModel(Application application){ dbmanager = new DbMnager(application); } public void updateUser(User user, boolean isUpdate){ dbmanager.updateUser(user,isUpdate); } } Now in your activity or fragment initialise your UserViewModel like this: UserViewModel userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
Then just update your user item this way, suppose your userId is 1122 and userName is "xyz" which has to be changed to "zyx".
Get an userItem of id 1122 User object
User user = new user(); if(user.getUserId() == 1122){ user.setuserName("zyx"); userViewModel.updateUser(user); }
This is a raw code, hope it helps you.
Happy coding
참고URL : https://stackoverflow.com/questions/45789325/update-some-specific-field-of-an-entity-in-android-room
'IT story' 카테고리의 다른 글
lock (new object ()) —화물 컬트 또는 미친 "언어 특수 사례"? (0) | 2020.09.14 |
---|---|
ASCII 코드는 7 비트입니까, 8 비트입니까? (0) | 2020.09.14 |
Haskell의 예외는 어떻게 작동합니까? (0) | 2020.09.14 |
벡터의 대안 (0) | 2020.09.14 |
git-flow를 따라 이전 릴리스의 핫픽스를 어떻게 처리해야합니까? (0) | 2020.09.14 |