2016-07-31 13 views
8

THE STORYFirebase @PropertyName nie działa

Używam Firebase Aktualizacje bazy danych w moim app. Mam taki model.

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

Teraz przechowuje to pole jako itemName w mojej bazie danych w czasie rzeczywistym. Ale nie chcę używać tej konwencji nazewnictwa. Chcę, aby wzorzec nazwy był taki: item_name.

co zrobiłem

użyłem @PropertyName ("nazwa_pozycji") powyżej pola jak ta,

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

PROBLEM

Firebase wydaje się po prostu zignorować adnotacja całkowicie. Nie ma możliwości, aby zmienić nazwy właściwości w celu serializacji i deserializacji.

Każda pomoc będzie bardzo ceniona.

EDIT

Oto pełna klasa model koncernu,

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

Jaka wersja Firebase Databa jak dołączyć do pliku build.gradle? –

+0

Jeśli twoja klasa "public"? Czy pole jest publiczne? Bez tych dwóch, nie będzie serializowany do JSON. –

+0

Używam wersji 9.2.1, najnowszych. Klasa i pole są zarówno publiczne, jak i serializowane, ale adnotacja o zmianie nazwy właściwości nie jest przestrzegana. –

Odpowiedz

15

końcu dostał szansę, aby rozwiązać ten problem. Dzięki @hatboysam za sugestię.

Jedyny problem polegał na tym, że adnotacja @PropertyName nie została odpowiednio udokumentowana w Firebase.

Pierwszą rzeczą, która jest niezbędna to pole musi być publicznego inaczej adnotacji nie będzie działać, co jest dość oczywiste/

Teraz adnotacja uwzględnia zarówno nazwę pola, jak również getter/setter name do serializacji. Miałem również problem z tym, że pola, jak również pobierające/ustawiające były serializowane, , co powodowało duplikowanie par ket/wartość.

Rozwiązałem problem przez , używając adnotacji na nazwach pól, które były publiczne i ignorując polecenia pobierające/ustawiające. To doskonale rozwiązało problem. Dane nie zostały poprawnie serializowane przy użyciu żądanej nazwy usługi i nie było również problemu z duplikatem danych.

Oto prosty przykład,

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

to nie potrzebujesz programów pobierających i ustawiających, jeśli pole jest publiczne. – Devrim

+1

Uwielbiam przechowywać/ustawiać zamiast dostępu do dowolnego publicznego pola. Czasami trzeba wprowadzić zmiany formatowania w tych metodach akcesorów. –

+0

Zła baza ogniowa. Uratowałeś mój tydzień .. dzięki stary .. –

11

Ewentualnie po prostu oznaczyć pobierające z @PropertyName zamiast właściwości adnotacji siebie - w ten sposób można zachować własności prywatnej, podczas gdy dostarczają nazw własnych:

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

rozwiązanie dla klasy danych Kotlin:

data class Pojo (@get:PropertyName("fieldName") @set:PropertyName("fieldName") var field: String = "") 
Powiązane problemy