@Ignore 在 Realm 中的实际应用?
Practical use of @Ignore in Realm?
我一直在尝试在我的 Android 应用程序中添加 Realm。他们的文档解释得很好并且易于理解。但它无法解释这一特定领域。我无法弄清楚 @Ignore
注释的实际用途。我知道此注释下的字段不会持久化。
有人可以分享一些用例吗?我也想知道这些领域的范围。我的意思是,如果我将 @Ignore
字段设置为某个值,该值是否可用于我的应用程序中的其他 类 以用于该特定启动会话。如果是,那么我们如何访问它?如果不是(我猜是这种情况),那我们为什么还需要这样一个字段?
我在这里和网上搜索过,但没有找到相关信息。如果出于我的无知,我错过了一些资源,请指导我。
谢谢。
根据官方文档(见https://realm.io/docs/java/latest/)@Ignore在两种情况下有用:
当你使用 GSON 集成并且你的 JSON 包含的数据比你想要存储的多,但你仍然想解析它,然后立即使用。
您不能在扩展 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"
.
我一直在尝试在我的 Android 应用程序中添加 Realm。他们的文档解释得很好并且易于理解。但它无法解释这一特定领域。我无法弄清楚 @Ignore
注释的实际用途。我知道此注释下的字段不会持久化。
有人可以分享一些用例吗?我也想知道这些领域的范围。我的意思是,如果我将 @Ignore
字段设置为某个值,该值是否可用于我的应用程序中的其他 类 以用于该特定启动会话。如果是,那么我们如何访问它?如果不是(我猜是这种情况),那我们为什么还需要这样一个字段?
我在这里和网上搜索过,但没有找到相关信息。如果出于我的无知,我错过了一些资源,请指导我。
谢谢。
根据官方文档(见https://realm.io/docs/java/latest/)@Ignore在两种情况下有用:
当你使用 GSON 集成并且你的 JSON 包含的数据比你想要存储的多,但你仍然想解析它,然后立即使用。
您不能在扩展 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"
.