2017-11-05 11 views
6

मैंने Anko SQLite के लिए दस्तावेज़ पढ़ लिए हैं।Anko में एक साधारण MapRowParser क्या है?

मुझे पता है कि एक साधारण RowParser iscan बनाने val rowParser = classParser<Person>()

कर classParser एक समारोह Anko-SQLite स्रोत कोड में परिभाषित किया गया है द्वारा किया जा।

मैं एक साधारण MapRowParser कैसे प्राप्त कर सकता हूं?

+0

https://stackoverflow.com/a/47076693/9204 –

+0

देखें, क्या आपका मतलब है कि Anko ने क्लासपार्स की तरह MapRowParser को पूर्वनिर्धारित नहीं किया है? मुझे अपने द्वारा MapRowParser लिखना है? – HelloCW

उत्तर

3

यदि आप गिथब पर जाते हैं और this search करते हैं, तो आप देखेंगे कि दो फाइलें हैं जहां MapRowParser को किसी भी तरह से संदर्भित किया गया है।

पहली फ़ाइल इस में शामिल हैं:

interface MapRowParser<out T> { 
    fun parseRow(columns: Map<String, Any?>): T 
} 

कौन सा एक अंतरफलक के रूप MapRowParser को दर्शाता है।

हालांकि। खोज के अनुसार दो फाइलें हैं जहां MapRowParser का उल्लेख किया गया है। यदि आप फ़ाइलों को देखते हैं, तो आप देखेंगे कि कोई कक्षा नहीं है। this question के अनुसार जो कक्षा के मैन्युअल कार्यान्वयन को दिखाता है, इसे मैन्युअल रूप से कार्यान्वित किया जाना है। इसके अलावा, Anko के लिए कोड MapRowParser लागू करने वाले किसी भी वर्ग को नहीं दिखाता है।

तो, आपको एक कक्षा बनाना है जो MapRowParser को अपने आप लागू करता है। यदि मैंने दस्तावेज़ों और कोड को सही तरीके से पढ़ा है, तो नक्शा स्वयं स्वचालित रूप से पारित हो जाता है लेकिन पार्सर जो करता है वह आपके द्वारा प्राप्त डेटा को संभालता है।


समान रूप से रोपरसर के साथ। यह एक इंटरफ़ेस है। हालांकि, there is a method that returns a specific parser। हालांकि RowMapParser के साथ ऐसा कुछ भी नहीं है।

संपादित करें:

the source code में जा रहे हैं पता चलता है कि एकल पंक्ति पारसर्स के दो प्रकार के कुछ विभिन्न प्रकार के लिए उपयोग किया जाता है। मुझे लगता है कि कोई MapRowParser नहीं है क्योंकि यह एक अच्छा, सामान्य नक्शा पार्सर लिखना बहुत कठिन है। मैप्स, जबकि एक सूची केवल एक मूल्य है कि आप एक प्रकार और वापसी के रूप में डाली है, के रूप में वे एक महत्वपूर्ण और एक मूल्य है सामान्य रूप में अलग अलग व्यवहार है:

private class SingleColumnParser<out T> : RowParser<T> { 
    override fun parseRow(columns: Array<Any?>): T { 
     if (columns.size != 1) 
      throw SQLiteException("Invalid row: row for SingleColumnParser must contain exactly one column") 
     @Suppress("UNCHECKED_CAST") 
     return columns[0] as T//Right here it just casts the column as the type defined when creating 
    } 
} 

आप मानचित्र के साथ भी ऐसा हो सकता है, लेकिन कुंजी होगा खो जाओ। इसके अतिरिक्त, स्रोत कोड के माध्यम से जांच कर आप देखते हैं कि पार्सर में पारित डेटा में केवल एक कॉलम होता है।

private fun readColumnsMap(cursor: Cursor): Map<String, Any?> { 
    val count = cursor.columnCount 
    val map = hashMapOf<String, Any?>() 
    for (i in 0..(count - 1)) { 
     map.put(cursor.getColumnName(i), cursor.getColumnValue(i)) 
    } 
    return map 
} 

अगर मैं स्रोत सही पढ़ा है, उपरोक्त विधि पूरी पंक्ति एक भी नक्शा में धर्मान्तरित, और स्तंभ का नाम लेता है:

स्रोत थोड़ा आगे भी में खुदाई के लिए इस विधि का पता चलता है इसके साथ।तो अगर आप एक ही पंक्ति के लिए कुछ इस तरह के साथ अंत:

Col1 -> Row1col1val 
Col2 -> Row1col2val 
... 

प्रणाली कर्सर, जो तरीकों में देखा जा सकता एक सूची में कई प्रविष्टियाँ पार्स करने के लिए या मानचित्र पर चलता है:

moveToFirst() 
while (!isAfterLast) { 
    list.add(parser.parseRow(readColumnsMap(this)))//adds the result into a pre-defined list to return 
    moveToNext() 
} 

जो फिर से दिखाता है कि जेनेरिक लिखना मुश्किल है, क्योंकि वहां वापसी मूल्य होना चाहिए जो समझ में आता है, जो करना मुश्किल है यदि आपको नहीं पता कि एक ही रिटर्न वैल्यू में किस प्रकार का डेटा डालना है।

और यह कुछ ऐसा है जो एक सामान्य पार्सर लिखने के लिए बहुत कठिन है, क्योंकि आप पंक्तियों की मात्रा, मूल्यों के साथ क्या किया जाना चाहिए आदि के बारे में कभी भी सुनिश्चित नहीं हो सकते हैं, इसलिए अपना खुद का पार्सर लिखने के लिए , आप एक वर्ग बनाते हैं जो MapRowParser लागू करता है और आपको आवश्यक डेटा को पार्स करने के लिए इसका उपयोग करता है। आईडी को ब्लॉब के रूप में संग्रहीत कक्षा में असाइन करके एक उदाहरण के लिए, डेटा को डेटा क्लास में डालकर, जो कुछ भी आप इसका उपयोग करते हैं।

* लिखना बहुत मुश्किल है क्योंकि आप कभी भी यह सुनिश्चित नहीं कर सकते कि एक डेवलपर को डेटा की आवश्यकता होगी। जब आपके पास मानचित्र के रूप में होता है तो आप केवल एक मान, वापस नहीं कर सकते हैं क्योंकि अन्य सभी डेटा खो जाएंगे। इसलिए यदि आपको सामान्य पार्सर के लिए जरूरी है तो आपको इसे मानचित्र के रूप में वापस करना होगा, और उसके बाद डेवलपर डेटा को पार्स करने के लिए समाप्त हो जाएगा। सूची के साथ बस एक ही मूल्य लौटना आसान है। लेकिन मैप्स के साथ, किसी भी डेटा को खोने के लिए, पार्सर अनिवार्य रूप से बेकार हो जाता है यदि यह मानकीकृत उद्देश्य के लिए लिखा गया है।

+0

धन्यवाद! Anko क्लास पार्सर क्यों लिखता है? लेकिन Anko MapRowParser के औजार क्यों नहीं लिखता है? मुझे लगता है कि यह बहुत अजीब है! – HelloCW

+0

मुझे नहीं पता कि उन्होंने इसे क्यों लागू नहीं किया। ऐसा इसलिए हो सकता है क्योंकि यह सामान्य उपयोग के लिए लागू करने के लिए एक बहुत ही जटिल प्रकार है। यद्यपि यदि आप इसका सटीक उत्तर चाहते हैं, तो आपको रचनाकारों से पूछना होगा। – Zoe

+0

@HelloCW ने कुछ और कोड खोदने और जवाब संपादित किया। – Zoe

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