我在本地数据库中有一个名为event的表,其中包含以下字段:
服务器会给我一个事件列表,没有收藏字段,收藏字段只是本地的。
我使用此代码插入事件
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertEvents(List<Event> events);
问题是,如果一个事件已经存储在本地数据库中,它将丢失所喜欢的属性,并且在插入和替换之后它将始终为false。
有没有办法像这样批量插入,但保留最喜欢的字段?
答案 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)
我遇到了同样的问题,这是我如何解决它的情景。