【发布时间】:2020-01-10 08:28:34
【问题描述】:
我有一个使用带有 json1 扩展名的 SQLite 作为其数据库后端的 Android 应用程序。虽然这可行,但操作 JSON 所需的 SQL 却很难理解,甚至更难维护。因此,我目前正在尝试使用 Realm 作为替代方案。虽然 Realm 在很大程度上是直观的,但 LinkingObjects 是一个我不完全理解的功能。考虑以下我目前使用的类
public class GridNode extends RealmObject
{
@PrimaryKey
private int id = 0;
@Index
private int lx = 0;
@Index
private int ly = 0;
@LinkingObjects("gridnode")
private final RealmResults<PassPoint> passpoints = null;
//getters, setters & constructors
}
public class PassPoint extends RealmObject
{
private GridNode gridnode;//each passpoint refers to one distinct GridNode object
private int hits;
private int lastVisited;
//getters, setters & constructors
}
在我的数据的当前 SQLite 版本中,我通过引用其 AUTO_INCREMENTing id 字段来识别每个 PassPoint 使用的 GridNode。有了 Realm,事情就变得简单多了,因为我可以简单地将 GridNode 本身用作 PassPoint 的一个属性。
这就是事情变得不太清楚的地方。假设我通过运行 RealmQuery 从Realm 检索现有的GridNode,例如
myrealm.where(GridNode.class).equalTo("lx",23).equalTo("ly",32).findFirst();
在字里行间我得出结论,运行此查询不仅会获取我所追求的 GridNode,而且会使用我的
运行隐式查询@LinkingObjects("gridnode")
private final RealmResults<PassPoint> passpoints = null;
用于检索引用相关 GridNode 的所有 PassPoint 对象列表的注释。
非常方便,但我发现自己想知道这是否不付出代价 - 运行该查询所需的时间。假设我还有一些其他类也引用了 GridNodes,在这种情况下,我将有更多的 @LinkingObjets 注释,这会导致进一步的隐式查询?
与此相反,如果我只是记录一个 GridNode id,我可以在需要时自己处理识别相关的 GridNode?实际上,以便利换取速度和响应能力?
或者也许我只是在字里行间读错了,这根本不是@LinkingObjects 的工作原理?
另一件不太清楚的事情——你会注意到gridnode 是PassPoint 类的私有成员。那么我如何能够在我的GridNode 类中创建@LinkingObjects("gridnode") 注释,而编译器不会抱怨我试图访问从PassPoint 类外部不可见的成员?
【问题讨论】:
标签: java android sqlite realm linkingobjects