gpt4 book ai didi

java - Realm 中的@LinkingObjects 注解是如何工作的

转载 作者:行者123 更新时间:2023-12-02 09:07:40 25 4
gpt4 key购买 nike

我有一个 Android 应用程序,它使用 SQLite 及其 json1 扩展作为其数据库后端。虽然这可行,但操作 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 版本中,我通过引用每个 PassPoint 的 AUTO_INCRMENTing id 字段来识别其使用的 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 的工作原理?

另一件事不太清楚 - 您会注意到 gridnodePassPoint 类的私有(private)成员。那么我如何能够在我的 GridNode 类中创建 @LinkingObjects("gridnode") 注释,而编译器不会提示我试图访问从不可见的成员在 PassPoint 类之外?

最佳答案

Reading between the lines I have concluded that running this query will not only fetch the GridNode I am after but run an implicit query

没有。不完全是。

正如 Realm 文档所述 here :

All fetches (including queries) are lazy in Realm, and the data is never copied.

这意味着定义查询的简单情况就是这样做的 - 它定义了它。但在用户明确请求之前,它不会评估/执行查询。因此,具有查询字段(例如 LinkingObjects 字段)的对象提供了一种简单的方法,用户可以通过该方法执行查询,但不会仅仅因为对象本身已加载而自动执行查询。它仅在 findFirst 时运行。或findAll (或类似)调用。

因此,如果您从未真正访问过 GridNode.passpoints字段,它永远不会被执行。

您可以通过一个简单的实验向自己证明这一点:-

  1. 检索 GridNode来自没有链接的 Realm PassPoint .
  2. 访问链接对象字段并检查其是否为空。
  3. 添加新的Passpoint到 Realm 并引用相同的GridNode .
  4. 重新测试您在步骤 1 中检索到的同一对象的链接对象字段,您应该看到查询结果现在包含新的 Passpoint .

关于第二个问题,简单的答案是模型字段的保护级别仅适用于数据的 Java 模型;它不适用于底层 Realm 模型。

关于java - Realm 中的@LinkingObjects 注解是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com