пример - чтение данных из firebase database android




Firebase @PropertyName не работает (2)

ИСТОРИЯ

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

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

В качестве альтернативы просто пометьте свои получатели @PropertyName вместо того, чтобы @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;
    }

}

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

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

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

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

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

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

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




firebase-realtime-database