2015-11-29 2 views
7

Я пытался добавить Realm в свое приложение для Android. Их документы довольно хорошо объяснены & легко следовать. Но он не объясняет эту конкретную область. Я не могу понять практическое использование аннотации @Ignore. Я знаю, что поля под этим аннотацией не сохраняются.Практическое использование @Ignore в королевстве?

Может кто-нибудь, пожалуйста, поделитесь несколькими вариантами использования. Также я хотел знать объем таких полей. Я имею в виду, если бы я установил поле @Ignore на какое-то значение, будет ли это значение доступным для других классов в моем приложении для этого конкретного сеанса запуска. Если да, то как мы к нему обращаемся? Если нет (что, я думаю, так и есть), то зачем нам такое поле в любом случае?

Я искал здесь и в Интернете, но не смог найти соответствующую информацию. Если из моего невежества я пропустил какой-то ресурс, пожалуйста, направляйте меня к нему.

Спасибо.

ответ

8

В соответствии с официальной документации (см https://realm.io/docs/java/latest/) @Ignore полезно в двух случаях:

  1. При использовании интеграции GSON и ваш JSON содержит больше данных, чем вы хотите сохранить, но вы все еще хотел бы разобрать его и использовать сразу после.

  2. Вы не можете создавать пользовательские геттеры и сеттеры в классах, расширяющих RealmObject, поскольку они будут переопределены. Но в любом случае, если вы хотите иметь какую-то пользовательскую логику, игнорируемые поля могут использоваться как хак, чтобы сделать это, потому что Realm не переопределяет их getter & сеттеры. Пример:

    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).

ОБНОВЛЕНИЕ: Как указано в указателе-нулевом указателе в примечаниях, второй пункт устарел. Теперь Realm позволяет создавать пользовательские геттеры и сеттеры в моделях Realm.

+0

Спасибо за ответ. Пример был очень полезным. – Anjani

+1

второй момент устарел, так как область теперь позволяет вам определять настраиваемые методы. –

3

Вот несколько реальных случаев использования:

1 - Получить FULLNAME пользователя:

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; 
} 
+1

Оба метода getFullName() 'и' getJson() 'возвращают вычисленные значения, а не содержимое полей с аннотацией @ @ Ignore, которая делает их совершенно не имеет значения. – Flawyte

0

Пожалуйста, смотрите на official documentation о @Ignore аннотация:

Аннотации @Ignore подразумевает, что поле не должно сохраняться на диске. Игнорируемые поля полезны, если ваш ввод содержит больше полей, чем ваша модель, и вы не хотите иметь много особых случаев для обработки этих неиспользуемых полей данных.

1

Я нашел полезным определять имена полей, когда я запрашиваю. Например,

Пользователь.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".

+0

Это, надо сказать, очень разумная вещь. – Anjani

+0

Поля 'static' не сохраняются в Realm, поэтому аннотация' @ Ignore' бесполезна в этом случае. – Flawyte

+0

@quidproquo Взгляните на эту библиотеку https://github.com/cmelchior/realmfieldnameshelper. Она генерирует имена полей для вас – skywall

Смежные вопросы