【问题标题】:Room - insert or replace, but keep a database field?房间 - 插入或替换,但保留一个数据库字段?
【发布时间】:2017-11-24 17:12:50
【问题描述】:

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

  • id (PK)
  • 姓名(文字)
  • 日期(时间)
  • 最喜欢的(整数,0 或 1)

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

我正在使用此代码插入事件

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

问题是,如果一个事件已经存储在本地数据库中,它会失去喜欢的属性,并且插入和替换后总是为假。

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

【问题讨论】:

  • 我认为你不能用这个批量插入来做到这一点
  • 可以分享insertEvents(List events)方法的代码
  • @UdayRamjiyani 就是这样,是道的抽象方法developer.android.com/reference/android/arch/persistence/room/…
  • 我也遇到了同样的问题,你找到解决办法了吗?
  • @jlively 不,目前没有解决方案。 :(

标签: android sqlite android-sqlite android-room


【解决方案1】:

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

用于远程数据的表 ServerData

ServerDataAttrs 仅用于本地数据。

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

ServerData.id == ServerDataAttrs.id

这样,ServerDataAttrs 中的每一行都与ServerData 中的对应行相关(不需要反过来,这就是我稍后使用LEFT JOIN 的原因)。您可以随时替换 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 中没有我之前提到的行。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,这就是我如何解决它的方案。

    • 检查您的数据库中是否有最喜欢的项目并获取它们。
    • 从 API 获取数据。
    • 将所有数据插入数据库。
    • 使用之前提取的已标记为收藏的项目更新您的数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2023-01-12
      • 2020-06-13
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多