gpt4 book ai didi

android - 房间 - 插入或替换,但保留数据库字段?

转载 作者:IT王子 更新时间:2023-10-29 06:24:05 25 4
gpt4 key购买 nike

我的本​​地数据库中有一个名为 event 的表,其中包含以下字段:

  • 身份证(主键)
  • 姓名(文字)
  • 日期(时间)
  • 最喜欢的(整数,0 或 1)

服务器会给我一个事件列表,没有最喜欢的字段,最喜欢的字段只是本地的。

我正在使用这段代码来插入事件

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertEvents(List<Event> events);

问题是,如果一个事件已经存储在本地数据库中,它将失去 favorite 属性,并且在插入和替换后它永远为 false。

有没有办法像这样批量插入,但保留最喜欢的字段?

最佳答案

我也遇到过这种情况。我就是这样解决的。由于来自服务器的数据是不可变的并且会重置本地值,因此我决定为来自服务器的数据保留一个表,为“本地”数据保留另一个表。

用于远程数据的表 ServerData

仅用于本地数据的表 ServerDataAttrs

ServerDataAttrs 包含所有本地列以及来自表 ServerData 的主键 id

ServerData.id == ServerDataAttrs.id

这样,ServerDataAttrs 中的每一行都与 ServerData 中的相应行相关(不需要另一种方式,这就是我稍后使用 的原因)左连接)。您始终可以替换 ServerData 上的数据,ServerDataAttrs 中的本地数据将保持不变。

我没有设置外键以避免意外删除。我仅在从其 DAO 调用 delete 方法时删除了本地数据。

为了查询数据,您可以创建一个包含所有远程值和本地值的 POJO

public class ServerDataWithAttrsPojo {
private long id;
private String name;
...
private int favorite;

// public constructor, getters and setters...
}

查询必须是两个表之间的JOIN

SELECT sd.id, sd.name, ...., sda.favorite
FROM ServerData sd LEFT JOIN ServerDataAttrs sda ON sd.id = sda.id

我使用 LEFT JOIN 以防来自 ServerData 的实体在 ServerDataAttrs 中没有一行,正如我之前提到的那样。

关于android - 房间 - 插入或替换,但保留数据库字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47477653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com