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似乎完全忽略了注释。 我无法改变序列化和反序列化的属性名称。

任何帮助将不胜感激。

编辑

这里是关注的完整模型类,

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

终于有机会解决这个问题了。 感谢@hatboysam的建议。

唯一的问题是,@ @PropertyName注释在Firebase中没有正确记录。

首先必要的是该领域必须是公开的,否则注解将不起作用,这是相当明显的/

现在注解考虑了字段名称以及getter / setter名称来序列化。 我也遇到了这样的问题,即字段以及getter / setter被序列化, 导致重复的ket / value对

我通过使用公开的字段名称上的注释来解决问题, 并忽略了getter / setter 。 这完美地解决了这个问题。 不是数据正确序列化与我想要的属性名称,也没有重复的数据问题。

这里是一个简单的例子,

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

或者,只需使用@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; } } 

Kotlin数据类的解决方案:

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