2016-07-31 17 views
8

काम नहीं करता है कहानी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 + 
        '}'; 
     } 
    } 
+0

फ़ायरबेस डाटाबेस का कौन सा संस्करण क्या आप अपनी build.gradle फ़ाइल में शामिल हैं? –

+0

यदि आपकी कक्षा 'सार्वजनिक' है? क्या क्षेत्र सार्वजनिक है? उन दोनों के बिना, यह जेएसओएन को क्रमबद्ध नहीं किया जाएगा। –

+0

मैं संस्करण 9.2.1 का उपयोग कर रहा हूं, नवीनतम। कक्षा और क्षेत्र दोनों सार्वजनिक हैं, और वे भी क्रमबद्ध हैं, बस संपत्ति नाम बदलने के लिए एनोटेशन का सम्मान नहीं किया जाता है। –

उत्तर

15

अंत में इस समस्या को हल करने का मौका मिला है। सुझाव के लिए @hatboysam के लिए धन्यवाद।

समस्या सिर्फ किया गया था, @PropertyName एनोटेशन ठीक से Firebase में दर्ज नहीं किया गया था।

पहली बात आवश्यक है कि क्षेत्र में होना चाहिए सार्वजनिक अन्यथा एनोटेशन काम नहीं करेगा, जो काफी स्पष्ट है/

अब एनोटेशन खाते में दोनों क्षेत्र नाम के रूप में अच्छी तरह से गेटर के रूप में लेता है serialize करने के लिए/सेटटर नाम। मुझे भी समस्या थी जहां फ़ील्ड के साथ-साथ गेटर/सेटर्स को क्रमबद्ध किया जा रहा था, जिसके परिणामस्वरूप डुप्लिकेट केट/वैल्यू जोड़े थे।

मैं फ़ील्ड नाम पर एनोटेशन जो जनता के थे का उपयोग करने और गेटर/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

यदि फ़ील्ड सार्वजनिक है तो आपको गेटर्स और सेटर्स की आवश्यकता नहीं है – Devrim

+1

मुझे किसी भी सार्वजनिक क्षेत्र तक पहुंचने के बजाय गेटर्स/सेटर्स रखना पसंद है। कभी-कभी मुझे इन एक्सेसर विधियों में स्वरूपण परिवर्तन करने की आवश्यकता होती है। –

+0

गरीब फायरबेस डॉक .. आपने मेरा सप्ताह बचाया .. धन्यवाद दोस्त .. –

11

वैकल्पिक रूप से सिर्फ @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; 
    } 

} 
4

समाधान कोटलिन डेटा क्लास के लिए:

data class Pojo (@get:PropertyName("fieldName") @set:PropertyName("fieldName") var field: String = "") 
संबंधित मुद्दे