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

时间:2017-11-24 17:12:50

标签: android sqlite android-sqlite android-room

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

  • id(PK)
  • 姓名(文字)
  • 日期(时间)
  • 收藏夹(int,0或1)

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

我使用此代码插入事件

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

问题是,如果一个事件已经存储在本地数据库中,它将丢失所喜欢的属性,并且在插入和替换之后它将始终为false。

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

2 个答案:

答案 0 :(得分:3)

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

远程数据的表import React from 'react'; import { BrowserRouter, Router, Route, Switch, Link, NavLink, Redirect } from 'react-router-dom'; import createHistory from 'history/createBrowserHistory'; import TabComponent from '../components/TabComponent'; export const history = createHistory(); const testText1 = () => (<div><p>asdas1</p></div>); const testText2 = () => (<div><p>asdas2</p></div>); const testText3 = () => (<div><p>asdas3</p></div>); const AppRouter = () => { console.log('HEREEE'); return ( <BrowserRouter history={history}> <div> <Switch> <Route path="/" component={testText1} exact={true} /> <Route path="/new" component={testText2} /> <Redirect from="/new" to="/" push /> <Route path="/latest" component={testText3} /> </Switch> </div> </BrowserRouter> ); } export default AppRouter;

ServerData表示仅限本地数据。

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

ServerData

这样,ServerData.id == ServerDataAttrs.id 中的每一行都与ServerDataAttrs中的对应行相关(不需要相反的方式,这就是我之后使用ServerData)的原因。您始终可以替换LEFT JOIN上的数据,ServerData中的本地数据将保持不变。

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

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

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中没有像我之前提到的那样。

答案 1 :(得分:2)

我遇到了同样的问题,这是我如何解决它的情景。

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