@Ignore 在 Realm 中的实际应用?

Practical use of @Ignore in Realm?

我一直在尝试在我的 Android 应用程序中添加 Realm。他们的文档解释得很好并且易于理解。但它无法解释这一特定领域。我无法弄清楚 @Ignore 注释的实际用途。我知道此注释下的字段不会持久化。

有人可以分享一些用例吗?我也想知道这些领域的范围。我的意思是,如果我将 @Ignore 字段设置为某个值,该值是否可用于我的应用程序中的其他 类 以用于该特定启动会话。如果是,那么我们如何访问它?如果不是(我猜是这种情况),那我们为什么还需要这样一个字段?

我在这里和网上搜索过,但没有找到相关信息。如果出于我的无知,我错过了一些资源,请指导我。

谢谢。

根据官方文档(见https://realm.io/docs/java/latest/@Ignore在两种情况下有用:

  1. 当你使用 GSON 集成并且你的 JSON 包含的数据比你想要存储的多,但你仍然想解析它,然后立即使用。

  2. 您不能在扩展 RealmObject 的 类 中创建自定义 getter 和 setter,因为它们将被覆盖。但是,如果您无论如何都想拥有一些自定义逻辑,可以将忽略的字段用作执行此操作的技巧,因为 Realm 不会覆盖它们的 getter 和 setter。示例:

    package io.realm.entities;
    
    import io.realm.RealmObject;
    import io.realm.annotations.Ignore;
    
    public class StringOnly extends RealmObject {
    
        private String name;
    
        @Ignore
        private String kingName;
    
        // custom setter
        public void setKingName(String kingName) { setName("King " + kingName); }
    
        // custom getter
        public String getKingName() { return getName(); }
    
        // setter and getter for 'name'
    }
    

忽略的字段只能从设置它们的对象访问(与 Java 中的常规对象相同)。

更新: 正如@The-null-Pointer- 在评论中指出的那样,第二点已经过时了。 Realm 现在允许在 Realm 模型中使用自定义 getters 和 setters。

这里有几个 real-world 用例:

1 - 获取用户的全名:

public class User extends RealmObject {

private String first;
private String last;

@Ignore
private String fullName;

public String getFullName() {
    return getFirst() + " " + getLast();
}

获取对象的 JSON 表示:

public class User extends RealmObject {

private String first;
private String last;

@Ignore
private JSONObject Json;

public JSONObject getJson() {
     try {
        JSONObject dict = new JSONObject();

        dict.put("first", getFirst());
        dict.put("last", getLast());
        return dict;
    } catch (JSONException e) {
        // log the exception
    }

    return null;
}

请参阅official documentation关于@Ignore的注释:

注解@Ignore 表示不应将字段保存到磁盘。如果您的输入包含的字段多于您的模型,并且您不希望有很多特殊情况来处理这些未使用的数据字段,则忽略的字段很有用。

我发现在查询时定义字段名称很有用。例如

User.java

public class User extends RealmObject {
    @Index
    public String name;

    @Ignore
    public static final String NAME = "name";
}

然后我可以做类似的事情:

realm.where(User.class).equalTo(User.NAME, "John").findFirst();

这样,如果模式从 name 变为 id,我就不必逐一查找 "name".