Android 文件室-插入或替换,但保留数据库字段?
我的本地数据库中有一个名为event的表,其中包含以下字段:Android 文件室-插入或替换,但保留数据库字段?,android,sqlite,android-sqlite,android-room,Android,Sqlite,Android Sqlite,Android Room,我的本地数据库中有一个名为event的表,其中包含以下字段: id(主键) 名称(文本) 日期(时间) 收藏夹(整数、0或1) 服务器会给我一个事件列表,没有收藏夹字段,收藏夹字段只是本地的 我正在使用此代码插入事件 @Insert(onConflict = OnConflictStrategy.REPLACE) void insertEvents(List<Event> events); @Insert(onConflict=OnConflictStrategy.REPLAC
- id(主键)
- 名称(文本)
- 日期(时间)
- 收藏夹(整数、0或1)
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertEvents(List<Event> events);
@Insert(onConflict=OnConflictStrategy.REPLACE)
无效插入事件(列出事件);
问题是,如果一个事件已经存储在本地数据库中,它将丢失favorite属性,并且在插入和替换之后它将始终为false
有没有一种方法可以像这样批量插入,但保留最喜欢的字段?我也遇到了同样的问题,这就是我如何解决这个问题的场景
- 检查数据库中是否有喜爱的项目,并获取它们
- 从API获取数据
- 将所有数据插入数据库
- 使用以前提取的标记为收藏夹的项目更新数据库
- 我也遇到过同样的情况。我就是这样解决的。
由于来自服务器的数据是不可变的,并且会重置本地值,因此我决定为来自服务器的数据保留一个表,为“本地”数据保留另一个表
远程数据的表
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...
}
然后,查询必须是两个表之间的联接
SELECT sd.id, sd.name, ...., sda.favorite
FROM ServerData sd LEFT JOIN ServerDataAttrs sda ON sd.id = sda.id
我使用LEFT JOIN
,以防ServerData
中的实体在ServerDataAttrs
中没有我前面提到的行。我认为您不能使用此批量插入来共享插入事件(列表事件)的代码method@UdayRamjiyani就是,,是Dao的抽象方法吗?我遇到了同样的问题,你找到解决方法了吗?@jl没有,目前没有解决方法:(