Firebase @PropertyName不起作用

时间:2016-07-31 06:09:23

标签: android firebase firebase-realtime-database

故事

我在我的应用中使用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 +
                    '}';
        }
    }

4 个答案:

答案 0 :(得分:27)

Kotlin数据类的解决方案:

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

答案 1 :(得分:23)

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

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

首先必须的是该字段必须公开否则注释将无效,这很明显/

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

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

这是一个简单的例子,

    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 :(得分:14)

或者只是使用@PropertyName标记您的getter而不是注释属性本身 - 这样您可以在提供自定义名称时保持属性的私密性:

public class User extends Object {

    private String mDisplayName;


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

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

}

答案 3 :(得分:0)

我想出了自己的 Kotlin 数据类解决方案,我已经在此处进行了描述https://stackoverflow.com/a/67601284/10226665