2010-11-29 16 views
7

मैं अपने एंड्रॉइड ऐप में किसी समस्या से जूझ रहा हूं। मैं एंड्रॉइड डॉक्स, एंड्रॉइड (एंड्रॉइड प्रो 2) पर अपनी पुस्तक पढ़ रहा हूं और लगभग हर उदाहरण को देखा है, मैं अपने हाथों को प्राप्त कर सकता हूं लेकिन को फ़ाइलों (छवियों, बाइनरी डेटा) को संग्रहीत करने के तरीके को कैसे कार्यान्वित करना है, यह पता नहीं लगा सकता सामग्री प्रदाता द्वारा खुलासा स्क्लाइट तालिका में रिकॉर्ड।_डेटा फ़ील्ड का उपयोग कर एंड्रॉइड डेटाबेस (कस्टम सामग्री प्रदाता) में फ़ाइल संग्रहीत करना - v1.6

यहाँ मैं क्या किया है (लगभग नोटपैड नमूना एप्लिकेशन के समान) है:

  • मेरी प्रदाता में ContentProvider कार्यान्वित। यह सब सीआरयूडी संचालन के लिए काम करता है। आंतरिक रूप से यह एक कार्यान्वयन का उपयोग करता SQLiteOpenHelper (सुंदर मानक सामान)
  • मैं प्रकार पाठ की एक _data स्तंभ
  • मैं एक रिकॉर्ड सम्मिलित और उरी वापस सामग्री प्रदाता पर
  • कॉल openOutputStream हो और डेटा
  • लेखन शुरू जोड़ लिया है

    Uri uri = getContentResolver().insert(MyAuthority.CONTENT_URI, contentValues); 
    OutputStream s = getContentResolver().openOutputStream(uri); 
    

    बू:

यह ठीक एंड्रॉयड प्रो 2 book.Here के अनुसार है कोड के इस भाग के स्निपेट है

11-29 01: 07: 30.717: टी मैं नीचे त्रुटि मिलती है चेतावनी/System.err (1490): java.io.FileNotFoundException: सामग्री पर प्रदाता द्वारा समर्थित नहीं फ़ाइलें:// myproviderauthority/पॉडकास्ट/1

मुझे क्या करने की ज़रूरत है? मैं एंड्रॉयड documentation पढ़ा लेकिन वे बहुत अस्पष्ट हैं:

क्षेत्र है कि ग्राहकों को डेटा को उजागर करता है वास्तव में एक सामग्री शामिल करना चाहिए: URI स्ट्रिंग।

1) तो पाठ होने के लिए फ़ील्ड प्रकार की जरूरत करता है या वहाँ एक विशेष content: URI string डेटा प्रकार है?

2) डालने के समय मेरे पास यूआरआई नहीं है। क्या मुझे यूआरआई डालने के बाद प्राप्त करने की आवश्यकता है और फिर रिकॉर्ड में उस फ़ील्ड को अपडेट करें?

रिकॉर्ड भी एक और क्षेत्र, नाम "_data" है कि कि फ़ाइल के लिए डिवाइस पर सटीक फ़ाइल पथ को सूचीबद्ध होना चाहिए। इस क्षेत्र का उद्देश्य ग्राहक द्वारा पढ़े गए होने का इरादा नहीं है, लेकिन सामग्री रिसेल्वर द्वारा।

3) तो क्या किया जाना चाहिए इस क्षेत्र के प्रकार हो सकता है? पाठ - मुझे लगता है?

ग्राहक सामग्री रिसेल्वर को कॉल करेगा।ओपनइनपुटस्ट्रीम() पर उपयोगकर्ता के सामने वाले क्षेत्र में आइटम के लिए यूआरआई है।

4) यह पूरी तरह बकवास है! मैं क्षेत्र पर ContentResolver.openInputStream() कैसे कॉल कर सकता हूं ?? आप इसे केवल रिकॉर्ड पर कॉल कर सकते हैं और उरी को पार कर सकते हैं।

आपके समय के लिए धन्यवाद और मुझे उम्मीद है कि आप मेरी मदद कर सकते हैं। मैंने इन SO प्रश्नों की समीक्षा भी की है (this और this) और उन्होंने मदद नहीं की।

जिस तरह से मैं एपीआई के स्तर 4 (संस्करण 1.6) के खिलाफ निर्माण कर रहा हूं।

उत्तर

3

यह देखने के लिए कि "प्रदाता द्वारा समर्थित कोई भी फाइल ..." कहां से आती है, here देखें। आपके द्वारा वर्णित एक के साथ स्थिति बहुत समान लगती है।

संक्षेप में, आपके सामग्री प्रदाता (या इसके कुछ सुपरक्लास) को openFile विधि को ओवरराइड और कार्यान्वित करने की आवश्यकता है। वह त्रुटि डिफ़ॉल्ट द्वारा उठाई जाती है "लागू नहीं - बैक ऑफ!" ContentProvider.java में कोड।

मुझे अटकने के दौरान ढांचे के अंतर्निहित स्रोत कोड पर ध्यान देना उपयोगी लगता है, क्योंकि दस्तावेज़ीकरण कभी-कभी थोड़ा सा कमी होता है।

+0

बहुत बहुत धन्यवाद! जैसा कि मैंने अनुमान लगाया था, इसमें ओपनफाइल को लागू करना शामिल है लेकिन इसका कोई उल्लेख नहीं था, निश्चित रूप से Google दस्तावेज़ में नहीं। अब जब मैं देखता हूं कि इसमें किसी फ़ाइल पर संग्रहीत करना शामिल है, तो यह मुझे लाभ प्रदान नहीं करता है क्योंकि मैं अपने कस्टम प्रदाता में फ़ाइल का पर्दाफाश नहीं कर रहा हूं। – Aliostad

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