2016-07-31 5 views
8

DIE GESCHICHTEFirebase @PropertyName funktioniert nicht

I Firebase Realtime-Datenbank in meiner app verwenden. Ich habe ein Modell so etwas.

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

Nun speichert diese das Feld als itemName in meiner Echtzeit-Datenbank. Aber ich möchte diese Namenskonvention nicht verwenden. Ich möchte das Namensmuster, item_name sein.

Was habe ich

ich die @PropertyName verwendet ("item_name") über dem Feld wie diese,

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

DAS PROBLEM

Firebase scheint nur das ignorieren Annotation vollständig. Es gibt keine Möglichkeit, die Eigenschaftsnamen für die Serialisierung und Deserialisierung zu ändern.

Jede Hilfe würde sehr geschätzt werden.

EDIT

Dies ist die komplette Modellklasse in Sorge,

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

Welche Version von Firebase Databa Was fügen Sie in Ihre Build.Gradle-Datei ein? –

+0

Wenn Ihre Klasse "öffentlich" ist? Ist das Feld öffentlich? Ohne diese beiden wird es nicht zu JSON serialisiert. –

+0

Ich verwende Version 9.2.1, die neuesten. Die Klasse und das Feld sind beide öffentlich und sie sind auch serialisiert, nur dass die Anmerkung zum Ändern des Eigenschaftsnamens nicht beachtet wird. –

Antwort

15

bekam schließlich eine Chance, dieses Problem zu lösen. Danke an @hatboysam für den Vorschlag.

Das einzige Problem war, @PropertyName Annotation wurde in Firebase nicht ordnungsgemäß dokumentiert.

Das erste, was notwendig ist, ist das das Feld öffentliche sonst die Anmerkung wird nicht funktionieren werden muss, was ganz offensichtlich/

Nun ist die Anmerkung berücksichtigt sowohl die Feldnamen als auch als Getter/Setter Namen zum Serialisieren. Ich hatte auch das Problem, wo die Felder sowie die Getter/Setter serialisiert wurden, resultierend in doppelten Ket/Wert Paaren.

Ich löste das Problem von mit der Annotation auf den Feldnamen, die öffentlich waren und ignorieren die Getter/Setter. Dies hat das Problem perfekt gelöst. Nicht die Daten wurden ordnungsgemäß mit dem Eigenschaftsnamen, den ich wollte, serialisiert, und es gab auch kein doppeltes Datenproblem.

Hier ist ein einfaches Beispiel,

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

Dann brauchen Sie nicht die Getters & Setter, wenn das Feld öffentlich ist. – Devrim

+1

Ich möchte Getter/Setter halten, anstatt auf ein öffentliches Feld zuzugreifen. Manchmal muss ich bei diesen Accessor-Methoden Formatierungsänderungen vornehmen. –

+0

Schlechte firebase doc .. Sie haben meine Woche gespeichert .. danke Dude .. –

11

Alternativ markieren Sie einfach Ihre Getter mit @PropertyName stattdessen Eigenschaften selbst mit Anmerkungen versehen - auf diese Weise Sie Eigenschaften privat und bietet gleichzeitig benutzerdefinierten Namen behalten:

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

Lösung für Kotlin Datenklasse:

data class Pojo (@get:PropertyName("fieldName") @set:PropertyName("fieldName") var field: String = "") 
Verwandte Themen