2017-06-12 9 views
8

क्या नए एंड्रॉइड आर्किटेक्चर घटक और कक्ष पर्सिस्टेंस लाइब्रेरी के साथ एंटिटी क्लास में एम्बेडेड फ़ील्ड के रूप में एनम प्रकार का उपयोग करना संभव है?एंड्रॉइड आर्किटेक्चर घटक: एनम्स का उपयोग

मेरे (एम्बेडेड Enum के साथ) इकाई:

@Entity(tableName = "tasks") 
public class Task extends SyncEntity { 

    @PrimaryKey(autoGenerate = true) 
    String taskId; 

    String title; 

    /** Status of the given task. 
    * Enumerated Values: 0 (Active), 1 (Inactive), 2 (Completed) 
    */ 
    @Embedded 
    Status status; 

    @TypeConverters(DateConverter.class) 
    Date startDate; 

    @TypeConverters(StatusConverter.class) 
    public enum Status { 
     ACTIVE(0), 
     INACTIVE(1), 
     COMPLETED(2); 

     private int code; 

     Status(int code) { 
      this.code = code; 
     } 

     public int getCode() { 
      return code; 
     } 
    } 
} 

मेरे TypeConverter:

public class StatusConverter { 

    @TypeConverter 
    public static Task.Status toStatus(int status) { 
     if (status == ACTIVE.getCode()) { 
      return ACTIVE; 
     } else if (status == INACTIVE.getCode()) { 
      return INACTIVE; 
     } else if (status == COMPLETED.getCode()) { 
      return COMPLETED; 
     } else { 
      throw new IllegalArgumentException("Could not recognize status"); 
     } 
    } 

    @TypeConverter 
    public static Integer toInteger(Task.Status status) { 
     return status.getCode(); 
    } 
} 

जब मैं इस संकलन मैं कह कोई त्रुटि मिलती है 'त्रुटि: (52, 12) त्रुटि: संस्थाओं और Pojos एक उपयोगी सार्वजनिक कन्स्ट्रक्टर होना चाहिए। आपके पास एक खाली कन्स्ट्रक्टर या एक कन्स्ट्रक्टर हो सकता है जिसका पैरामीटर फ़ील्ड (नाम और प्रकार के अनुसार) से मेल खाता है। '

अद्यतन 1 मेरे SyncEntity वर्ग:

/** * सभी कमरे संस्थाएं जो सिंक्रनाइज़ किए जाते हैं के लिए आधार वर्ग। */

@Entity 
public class SyncEntity { 

    @ColumnInfo(name = "created_at") 
    Long createdAt; 

    @ColumnInfo(name = "updated_at") 
    Long updatedAt; 
} 
+0

'SyncEntity' किसी भी कंस्ट्रक्टर्स को परिभाषित करता है? – CommonsWare

+0

नहीं, ऐसा नहीं है। SyncEntity.class के साथ अद्यतन समस्या। – Bohsen

+0

मुझे लगता है कि आपको या तो अपने फ़ील्ड को 'सार्वजनिक' बनाने की ज़रूरत है, 'सार्वजनिक' सेटर्स प्रदान करें, या 'सार्वजनिक' कन्स्ट्रक्टर प्रदान करें जो आपके '@ क्वेरी' कॉलम से मेल खाता हो। अन्यथा, कमरा आपको डेटा प्रदान नहीं कर सकता है।आपका एकमात्र कन्स्ट्रक्टर शून्य-तर्क वाला है। – CommonsWare

उत्तर

13

मैं TypeConverters साथ Room पर enum मूल्यों का उपयोग कर सकते हैं। आपके कोड में कुछ हिस्सों को बदलने के लिए कुछ भाग हैं:

1) आपको अपनी संस्था के फ़ील्ड को सार्वजनिक घोषित करना होगा या उनके पास सार्वजनिक गेटर्स/सेटर्स होना चाहिए। या फिर आप त्रुटि नीचे मिलेगा:

yourField is not public in YourEntity; cannot be accessed from outside package

2) आप अपने status क्षेत्र के लिए @Embedded एनोटेशन जरूरत नहीं है। यह घोंसला वस्तुओं के लिए है। More from docs.

3) आपने सही स्थान पर @TypeConverters एनोटेशन का उपयोग नहीं किया था। आपके मामले में इसे status फ़ील्ड से ऊपर सेट किया जा सकता है। More from docs.

4) आप या आपके इकाई के लिए एक निर्माता को परिभाषित करना होगा आप त्रुटि नीचे मिलेगा:

Entities and Pojos must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).

आपको यह त्रुटि को छोड़ने के लिए एक खाली निर्माता परिभाषित कर सकते हैं।

5) अपने टाइप कनवर्टर में इंटीजर की बजाय int का उपयोग करें।

योग; नीचे के रूप में की उम्मीद काम करता है:

@Entity(tableName = "tasks") 
public class Task extends SyncEntity { 

    @PrimaryKey(autoGenerate = true) 
    public String taskId; 

    public String title; 

    /** Status of the given task. 
    * Enumerated Values: 0 (Active), 1 (Inactive), 2 (Completed) 
    */ 
    @TypeConverters(StatusConverter.class) 
    public Status status; 

    @TypeConverters(DateConverter.class) 
    public Date startDate; 

    // empty constructor 
    public Task() { 
    } 

    public enum Status { 
     ACTIVE(0), 
     INACTIVE(1), 
     COMPLETED(2); 

     private int code; 

     Status(int code) { 
      this.code = code; 
     } 

     public int getCode() { 
      return code; 
     } 
    } 
} 
+0

धन्यवाद @Devrim यह –

+0

"अपने TypeConverter में पूर्णांक के बजाय पूर्णांक उपयोग" था तो आप * अपने enums के लिए जरूरी * उपयोग पूर्णांक मूल्यों, इस यह करने के लिए सही तरीका है के लिए। कभी भी ordinal का उपयोग करें। –

1

आसान बनाने में मदद करने के लिए:

public enum Status { 
    ACTIVE, 
    INACTIVE, 
    COMPLETED; 
} 

फिर, अपनी कन्वर्टर्स:

@TypeConverter 
public static Task.Status toStatus(int ordinal) { 
    return Task.Status.values()[ordinal]; 
} 

@TypeConverter 
public static Integer toOrdinal(Task.Status status) { 
    return status.ordinal(); 
} 
+0

काम करता है। सभी परीक्षण पास बहुत बहुत धन्यवाद। – Bohsen

+3

ऑर्डिनल्स उपयोग करने के लिए खतरनाक हैं, यह कोड आप लिख रहे हैं की मात्रा को कम लेकिन बीच में या जल्दी से कोई भी बदलाव कर सकते हैं अपने कोड में अजीब त्रुटियों का कारण। यह अनुशंसित नहीं है। –

+0

@AndrewT तो तुम को पूर्ववत करने की सलाह देते हैं और मूल कोड का प्रयोग करेंगे? – Bohsen

संबंधित मुद्दे