2017-10-06 76 views
4

如何使用房間庫更新整行,@Update採用@Entity帶註釋的對象並通過引用主鍵進行更新,但是如何通過某些其他參數值與一行中的單元格中的值相匹配。使用房間持久性庫更新參數

//Simple update 
@Update 
int updateObject(ObjectEntity... objectEntities); 

//Custom Update 
@Query(UPDATE TABLENAME ????) 
int updateObject(ObjetEntity objectEntity,String field); 

我應該通過在地方的什麼????這樣新的objectEntity被替換爲字段值匹配的舊字段。

回答

4

因爲Room不允許您動態定義列,所以您必須知道您提前與哪個列匹配。比方說,你如下有一個實體Person

@Entity(tableName = "people") 
public final class Person { 

    @PrimaryKey 
    @ColumnInfo(name = "uuid") 
    public final String uuid; 

    @ColumnInfo(name = "name") 
    public final String name; 

    @ColumnInfo(name = "is_alive") 
    public final Boolean isAlive; 

    public Person(String uuid, String name, Boolean isAlive) { 
     this.uuid = uuid; 
     this.name = name; 
     this.isAlive = isAlive; 
    } 
} 

你想這取決於name更新列is_alive。你可以寫的方法:

@Query("UPDATE people SET is_alive= :alive WHERE name = :name") 
public abstract int setIsAliveByName(String name, int alive); 

這當然可以得到相當乏味,如果你有其中有許多領域的實體,因爲你必須在每場傳遞作爲一個單獨的參數,並寫入整個UPDATE查詢用手。

另一種方法是先執行SELECT查詢來首先獲取項目,用新數據更新對象,然後將其保存回數據庫。

在這一點上,你開始懷疑使用ORM是否真的讓事情變得更容易,值得你花費時間...