小编典典

更新android Room中实体的某些特定字段

all

我正在为我的新项目使用 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 1where id = 1;
(id 是自动生成的主键)。

// Entity:

@Entity
public class Tour {
    @PrimaryKey(autoGenerate = true)
    public long id;
    private String startAddress;
    private String endAddress;
    //constructor, getter and setter
}

阅读 130

收藏
2022-07-28

共1个答案

小编典典

我想知道如何更新一些字段(不是全部),如方法 1 其中 id = 1

使用@Query,就像在方法 2 中所做的那样。

在我的情况下查询太长,因为我的实体中有很多字段

然后有更小的实体。或者,不要单独更新字段,而是与数据库进行更粗粒度的交互。

IOW,Room 本身没有任何东西可以满足您的需求。

更新 2020-09-15 :Room
现在有部分实体支持,可以帮助解决这种情况。有关更多信息,请参阅此答案。

从 2019 年 10 月发布的Room 2.2.0 开始,您可以指定目标实体进行更新。那么如果更新参数不同,Room 只会更新部分实体列。OP 问题的示例将更清楚地说明这一点。

@Update(entity = Tour::class)
fun update(obj: TourUpdate)

@Entity
public class TourUpdate {
    @ColumnInfo(name = "id")
    public long id;
    @ColumnInfo(name = "endAddress")
    private String endAddress;
}

请注意,您必须创建一个名为 TourUpdate 的新部分实体,以及问题中的真实 Tour 实体。现在,当您使用 TourUpdate 对象调用 update 时,它将更新 endAddress 并保持 startAddress 值相同。这对我来说非常适合我在 DAO 中使用 insertOrUpdate 方法的用例,该方法使用来自 API 的新远程值更新数据库,但将本地应用程序数据单独留在表中。

2022-07-28