2012-10-03 14 views
17

से बड़े ब्लॉब को पुनर्प्राप्त करें मैंने एंड्रॉइड के Cursor में अधिकतम 1 एमबी डेटा धारण किए बिना एंड्रॉइड ऐप के एसक्लाइट डेटाबेस में द्विआधारी डेटा (प्रोटोबफ्स) के हिस्सों को संग्रहीत किया है। अब मुझे पता है कि मुझे इन बाइनरी ब्लॉब्स को फाइलों में संग्रहित करना चाहिए था और केवल SQLite डेटाबेस प्रविष्टियों में फ़ाइलों का संदर्भ देना चाहिए था।एंड्रॉइड स्क्लाइट डेटाबेस

इन बाइनरी हिस्सों को फ़ाइलों में स्थानांतरित करने के लिए मुझे डेटाबेस को अपग्रेड करना होगा (ऐप थोड़ी देर के लिए उपयोग में है)। समस्या यह है कि कुछ उपयोगकर्ता का डेटा पहले से ही 1 एमबी सीमा से अधिक हो सकता है और मैं इसे डेटाबेस से पुनर्प्राप्त नहीं कर पा रहा हूं (परिणामी Cursor को एक पंक्ति के लिए एक्सेस करना जिसमें एक बड़ा ब्लॉब IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialize before accessing data from it फेंकता है)।

मैं 1 एमबी Cursor सीमा से अधिक बाइनरी ब्लब्स कैसे प्राप्त करूं जो SQLite डेटाबेस में संग्रहीत हैं?

+0

अरे, धन्यवाद! इस सवाल ने मुझे उसी मुद्दे का विश्लेषण और हल करने में मदद की जो मुझे सामना कर रहा था! –

उत्तर

27

आप टुकड़ों में बड़े ब्लब्स पढ़ सकते हैं। सबसे पहले यह पता लगाना कि कौन सा इस इलाज की जरूरत:

SELECT id, length(blobcolumn) FROM mytable WHERE length(blobcolumn) > 1000000 

और फिर substr साथ हिस्सा पढ़ें: या तो BLOB stream I/O कार्य या

SELECT substr(blobcolumn,  1, 1000000) FROM mytable WHERE id = 123 
SELECT substr(blobcolumn, 1000001, 1000000) FROM mytable WHERE id = 123 
... 

तुम भी SQLite की अपनी स्वयं की प्रतिलिपि और पहुँच संकलन सकता है एनडीके के साथ सी एपीआई के सामान्य प्रश्न कार्य, लेकिन यह इस मामले में बहुत जटिल होगा।

+0

आपको बहुत बहुत धन्यवाद! यह वास्तव में मदद की। मुझे SQLite कोर फ़ंक्शंस के बारे में कोई जानकारी नहीं थी। पूरी तरह से काम किया! – ashughes

+0

क्या आपके पास एक संपूर्ण 'बाइट []' बनाने के लिए उन हिस्सों को जोड़ने का कोई प्रभावी तरीका है? –

+0

@ कामरहैमड आप पहले से ही पूरी लंबाई जानते हैं, इसलिए एक बड़ी सरणी आवंटित करें और भाग कॉपी करें। –

0

सीएल। जवाब केवल blobs < 5 एमबी के साथ होगा। यदि आपने इसे 5 मेगाबाइट से बड़े ब्लॉब्स के साथ उपयोग करने का प्रयास किया है तो आपको अभी भी अपवाद मिलेगा। बड़े ब्लॉब्स लाने के लिए आपको sqlite4java नामक लाइब्रेरी का उपयोग करने की आवश्यकता है जो कर्सर का उपयोग किये बिना डेटाबेस में देशी कॉल का उपयोग करता है। यहां एक बड़ा ब्लॉब लाने के लिए इस लाइब्रेरी का उपयोग करने का एक उदाहरण दिया गया है:

SQLiteConnection sqLiteConnection=null; 
SQLiteStatement sqLiteStatement=null; 
try 
{ 
    File databaseFile = context.getDatabasePath("database.db"); 
    sqLiteConnection=new SQLiteConnection(databaseFile); 
    sqLiteConnection.open(); 
    sqLiteStatement=sqLiteConnection.prepare("SELECT blob FROM table WHERE id=?"); 
    sqLiteStatement.bind(1, id); 
    sqLiteStatement.step(); 
    byte[] blob=sqLiteStatement.columnBlob(0); 
} 
finally 
{ 
    if(sqLiteStatement!=null) 
     sqLiteStatement.dispose(); 
    if(sqLiteConnection!=null) 
     sqLiteConnection.dispose(); 
} 
संबंधित मुद्दे