2016-07-31 3 views
8

ИСТОРИЮFirebase @PropertyName не работает

Я использую Firebase в реальном времени базы данных в моем приложении. У меня есть модель вроде этого.

class Item { 
    int mItemName; 
    // Simplified for brevity 
} 

Теперь, это сохраняет поле как itemName в моей реальной базе данных времени. Но я не хочу использовать это соглашение об именах. Я хочу, чтобы шаблон именования был таким, item_name.

ЧТО Я СДЕЛАЛ

Я использовал @PropertyName ("item_name") над полем, как это,

class Item { 
     @PropertyName("item_name") 
     int mItemName; 
     // Simplified for brevity 
    } 

ПРОБЛЕМА

Firebase кажется просто игнорировать аннотация полностью. Я не могу изменить имена свойств для сериализации и десериализации.

Любая помощь будет высоко оценена.

EDIT

Вот полный класс модель концерна,

public class FileModel { 

     @PropertyName("file_id") 
     String mFileId; 
     @PropertyName("file_name") 
     String mOriginalFileName; 
     @PropertyName("file_path") 
     String mFilePath; 
     @PropertyName("file_type") 
     String mFileType; 
     @PropertyName("last_modified") 
     Long mFileLastModified; 
     @PropertyName("file_size") 
     String mFileSize; 
     @Exclude 
     private boolean mIsSelected; 

     /** 
     * Must have empty constructor for JSON deserialization by Firebase 
     */ 
     public FileModel() { 
     } 

     public FileModel(String fileId, String originalFileName, 
            String filePath, String fileType, Long fileLastModified, String fileSize) { 
      this.mFileId = fileId; 
      this.mOriginalFileName = originalFileName; 
      this.mFilePath = filePath; 
      this.mFileType = fileType; 
      this.mFileLastModified = fileLastModified; 
      this.mFileSize = fileSize; 
     } 

     public String getFileId() { 
      return mFileId; 
     } 

     public void setFileId(String fileId) { 
      this.mFileId = fileId; 
     } 

     public String getOriginalFileName() { 
      return mOriginalFileName; 
     } 

     public void setOriginalFileName(String originalFileName) { 
      this.mOriginalFileName = originalFileName; 
     } 

     public String getFilePath() { 
      return mFilePath; 
     } 

     public void setFilePath(String filePath) { 
      this.mFilePath = filePath; 
     } 

     public String getFileType() { 
      return mFileType; 
     } 

     public void setFileType(String fileType) { 
      this.mFileType = fileType; 
     } 

     public Long getFileLastModified() { 
      return mFileLastModified; 
     } 

     public void setFileLastModified(Long fileLastModified) { 
      this.mFileLastModified = fileLastModified; 
     } 

     public String getFileSize() { 
      return mFileSize; 
     } 

     public void setFileSize(String fileSize) { 
      this.mFileSize = fileSize; 
     } 

     public boolean getIsSelected() { 
      return mIsSelected; 
     } 

     public void setIsSelected(boolean isSelected) { 
      this.mIsSelected = isSelected; 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (this == o) return true; 
      if (o == null || getClass() != o.getClass()) return false; 

      FileModel model = (FileModel) o; 

      if (mIsSelected != model.mIsSelected) return false; 
      if (mFileId != null ? !mFileId.equals(model.mFileId) : model.mFileId != null) return false; 
      if (mOriginalFileName != null ? !mOriginalFileName.equals(model.mOriginalFileName) : model.mOriginalFileName != null) 
       return false; 
      if (mFilePath != null ? !mFilePath.equals(model.mFilePath) : model.mFilePath != null) 
       return false; 
      if (mFileType != null ? !mFileType.equals(model.mFileType) : model.mFileType != null) 
       return false; 
      if (mFileLastModified != null ? !mFileLastModified.equals(model.mFileLastModified) : model.mFileLastModified != null) 
       return false; 
      return mFileSize != null ? mFileSize.equals(model.mFileSize) : model.mFileSize == null; 

     } 

     @Override 
     public int hashCode() { 
      int result = mFileId != null ? mFileId.hashCode() : 0; 
      result = 31 * result + (mOriginalFileName != null ? mOriginalFileName.hashCode() : 0); 
      result = 31 * result + (mFilePath != null ? mFilePath.hashCode() : 0); 
      result = 31 * result + (mFileType != null ? mFileType.hashCode() : 0); 
      result = 31 * result + (mFileLastModified != null ? mFileLastModified.hashCode() : 0); 
      result = 31 * result + (mFileSize != null ? mFileSize.hashCode() : 0); 
      result = 31 * result + (mIsSelected ? 1 : 0); 
      return result; 
     } 

     @Override 
     public String toString() { 
      return "FileModel{" + 
        "mFileId='" + mFileId + '\'' + 
        ", mOriginalFileName='" + mOriginalFileName + '\'' + 
        ", mFilePath='" + mFilePath + '\'' + 
        ", mFileType='" + mFileType + '\'' + 
        ", mFileLastModified=" + mFileLastModified + 
        ", mFileSize='" + mFileSize + '\'' + 
        ", mIsSelected=" + mIsSelected + 
        '}'; 
     } 
    } 
+0

Какая версия Firebase Databa Вы включаете в свой файл build.gradle? –

+0

Если ваш класс 'public'? Поле открыто? Без этих двух, он не будет сериализован для JSON. –

+0

Я использую версию 9.2.1, последнюю. Класс и поле являются общедоступными, и они также сериализованы, так что аннотация для изменения имени свойства не соблюдается. –

ответ

15

Наконец получил шанс решить эту проблему. Благодаря @hatboysam за предложение.

Единственная проблема была, @PropertyName аннотация не была должным образом задокументирована в Firebase.

Первое, что нужно это поле должно быть общественности иначе аннотацию не будет работать, что вполне очевидно,/

Теперь аннотацию учитывает как имя поля, а также геттер/setter для сериализации. У меня также возникла проблема, когда поля, а также геттер/сеттеры становились сериализованными, приводят к дублированию пар ket/value.

Я решил проблему , используя аннотацию на имя поля, которое было общедоступным и игнорировало приемники/сеттеры. Это решило проблему отлично. Не данные были правильно сериализованы с именем свойства, которое я хотел, и не было и дублированной проблемы с данными.

Вот простой пример,

class Item { 

     @PropertyName("item_no") 
     int mItemNo; 
     // Simplified for brevity 

     @Exclude 
     public int getItemNo(){ 
       return mItemNo; 
     } 

     @Exclude 
     public void setItemNo(int itemNo){ 
       this.mItemNo = itemNo; 
     } 
    } 
+2

, тогда вам не нужны геттеры и сеттеры, если это поле является общедоступным. – Devrim

+1

Мне нравится держать геттеры/сеттеры вместо доступа к любому публичному полю. Иногда мне нужно внести изменения форматирования в эти методы доступа. –

+0

Плохого db firebase .. Вы спасли мою неделю .. спасибо Чувак .. –

11

В качестве альтернативы просто пометить добытчик с @PropertyName вместо аннотирования Свойства себя - таким образом, вы можете сохранить свойства частным в то время как предоставление пользовательских имен:

public class User extends Object { 

    private String mDisplayName; 


    @PropertyName("userName") 
    public String getDisplayName() { 
     return mDisplayName; 
    } 

    @PropertyName("userName") 
    public void setDisplayName(String displayName) { 
     mDisplayName = displayName; 
    } 

} 
4

решения для Kotlin класс данных:

data class Pojo (@get:PropertyName("fieldName") @set:PropertyName("fieldName") var field: String = "") 
Смежные вопросы