我一直试图在我的Android应用中添加Realm。他们的文档很好地解释了&容易遵循。但它无法解释这个特定领域。我无法弄清楚public Person(string FirstName, string LastName, string Profession)
{
_firstName = FirstName;
_lastName = LastName;
_profession = Profession;
}
private string _firstName;
public string FirstName
{
get { return this._firstName; }
set { this._firstName = value; RaisePropertyChanged("FirstName"); }
}
private string _lastName;
public string LastName
{
get { return _lastName; }
set { _lastName = value; RaisePropertyChanged("LastName"); }
}
private string _profession;
public string Profession
{
get { return _profession; }
set { _profession = value; RaisePropertyChanged("Profession"); }
}
注释的实际用途。我知道这个注释下的字段不会被保留。
有人可以分享一些用例。我也想知道这些领域的范围。我的意思是,如果我将@Ignore
字段设置为某个值,那么该值可用于我的应用中针对该特定启动会话的其他类。如果是,那么我们如何访问它?如果没有(我猜是这样),那么为什么我们还需要这样一个领域呢?
我在这里和网上搜索过但无法找到相关信息。如果出于我的无知,我错过了一些资源,请指导我。
感谢。
答案 0 :(得分:10)
根据官方文档(参见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中的常规对象相同)。
UPDATE:由于@ The-null-Pointer-在评论中指出,第二点已过时。 Realm现在允许在Realm模型中使用自定义getter和setter。
答案 1 :(得分:3)
以下是几个真实用例:
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;
}
答案 2 :(得分:1)
我发现在查询时定义字段名称很有用。例如
<强> 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"
。
答案 3 :(得分:0)
请参阅关于 @Ignore 注释的official documentation:
注释 @Ignore 表示不应将字段持久保存到磁盘。如果您的输入包含的字段多于模型,则忽略的字段很有用,并且您不希望有许多特殊情况来处理这些未使用的数据字段。