पढ़ना और iPhone उपयोग के लिए एक SQLite DB के लिए छवियों को लिख

वोट
22

मैं एक SQLite DB है कि वर्तमान में रीड और राईट सेट कर लेते हैं NSStringपूरी तरह से है। मैं भी डेटाबेस में एक छवि संग्रहीत करना चाहते हैं और इसे बाद में याद करते हैं। मैं प्रयोग पर थोड़ा पढ़ा है NSDataऔर छवि एन्कोडिंग, लेकिन मैं पूरी तरह से यकीन है कि क्या वाक्य रचना मुझे क्या करना चाहते हैं के लिए है नहीं कर रहा हूँ। किसी भी कोड के टुकड़े या उदाहरण बहुत सराहना की जाएगी।

मेरे वर्तमान प्रक्रिया इस प्रकार है: UIImagePickerController-> उपयोगकर्ता तस्वीरें से छवि का चयन -> chosenImage के कहने पर सेट है UIImageView> - अब मैं इस छवि को लेने के लिए और डीबी में संग्रहीत करना चाहते हैं

मैं इस कॉल अंत में एक दूरस्थ सर्वर के लिए एक कॉल से बदल दिया जाएगा उल्लेख करना चाहिए। सुनिश्चित नहीं हैं कि अगर यह एक अंतर के रूप में अब तक प्रदर्शन चला जाता है के रूप में आता है।

13/03/2009 को 18:03
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


6 जवाब

वोट
31

आप SQLite में भंडारण के लिए एक बाइनरी ब्लॉब में UIImage अपने UIImageView में होस्ट की गई बदलने की आवश्यकता होगी। ऐसा करने के लिए, आप निम्न का उपयोग कर सकते हैं:

NSData *dataForImage = UIImagePNGRepresentation(cachedImage);
sqlite3_bind_blob(yourSavingSQLStatement, 2, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT);

यह आपकी छवि का एक पीएनजी प्रतिनिधित्व उत्पन्न होगा एक NSData उदाहरण में संग्रहीत, और फिर अपने SQL क्वेरी में दूसरा तर्क के लिए एक बूँद के रूप में NSData से बाइट्स बाँध। उस प्रारूप में स्टोर करने के लिए, यदि आप चाहें ऊपर में UIImageJPEGRepresentation का प्रयोग करें। आप ब्लॉब स्तंभ अपने SQLite डेटाबेस में उचित तालिका में जोड़ा गया है की आवश्यकता होगी।

इस छवि को पुनः प्राप्त करने के लिए, आप निम्नलिखित का उपयोग कर सकते हैं:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
13/03/2009 को 18:41
का स्रोत उपयोगकर्ता

वोट
9

एप्पल सिफारिश ब्लॉब के स्टोर करने के लिए नहीं SQLite डेटाबेस ~ 2 किलोबाइट से भी बड़ा कर रहे हैं में है।

SQLite पन्नों में डेटाबेस का आयोजन करता है। प्रत्येक पृष्ठ आकार में 4 किलोबाइट है। आप SQLite डेटाबेस फ़ाइल से डेटा पढ़ने जब यह एक आंतरिक पेज कैश में इन पृष्ठों लोड करता है। iPhone पर मुझे लगता है कि आकार 1 मेगाबाइट को यह कैश चूक। इस आसन्न रिकॉर्ड पढ़ने बहुत तेजी से, क्योंकि वे शायद पहले से ही पेज कैश में हो जाएगा बनाता है।

SQLite स्मृति में अपने डेटाबेस रिकॉर्ड पढ़ता है जब यह पूरे रिकॉर्ड और पृष्ठों है कि यह पर है के सभी पढ़ता है। इसलिए यदि आपके रिकॉर्ड ब्लॉब सम्मिलित हैं, तो कई पृष्ठों पर कब्जा कर सकता है और आप कैश से मौजूदा पृष्ठों को निकाल दिया जाएगा और उन्हें अपने ब्लॉब रिकॉर्ड के पृष्ठों से प्रतिस्थापित करना।

यह इतना बुरा करता है, तो आप सिर्फ के माध्यम से स्कैनिंग कर रहे हैं और अपने सभी Blobs लोड हो रहा है उनके साथ कुछ (उन्हें उदाहरण के लिए प्रदर्शित) करने के लिए नहीं है। लेकिन अगर मान लीजिए कि आप एक प्रश्न है जहाँ आप बस कुछ डेटा ब्लॉब इस क्वेरी से अगर रिकॉर्ड बड़ी ब्लॉब शामिल नहीं किया बहुत धीमी होगी के रूप में एक ही पंक्ति में है कि प्राप्त करना चाहता था था।

तो कम से कम आप एक अलग तालिका में अपने ब्लॉब डेटा स्टोर करना चाहिए। उदाहरण के लिए:

CREATE TABLE blobs ( id INTEGER PRIMARY KEY, data BLOB );
CREATE TABLE photos ( id INTEGER PRIMARY KEY, name TEXT, blob_id INTEGER, 
    FOREIGN KEY(blob_id) REFERENCES blobs(id) );

या बेहतर अभी तक, SQLite डेटाबेस के बाहर फ़ाइलों के रूप में ब्लॉब डेटा स्टोर।

ध्यान दें कि यह साथ पेज कैश आकार tweak संभव हो सकता है एसक्यूएल PRAGMA बयान (यदि आप CoreData का उपयोग नहीं कर रहे हैं)।

15/04/2011 को 11:21
का स्रोत उपयोगकर्ता

वोट
9

एक विकल्प (और आमतौर पर जब एसक्यूएल में काम को प्राथमिकता) प्रणाली पर एक फाइल करने के लिए छवि लिख सकते हैं और डेटाबेस में पथ (या पहचानकर्ता के कुछ अन्य प्रकार) स्टोर करने के लिए है।

13/03/2009 को 18:32
का स्रोत उपयोगकर्ता

वोट
2

SQLite DB के लिए छवि लेखन

if(myImage != nil){
    NSData *imgData = UIImagePNGRepresentation(myImage);
    sqlite3_bind_blob(update_stmtement, 6, [imgData bytes], [imgData length], NULL);    
    }
    else {
        sqlite3_bind_blob(update_stmtement, 6, nil, -1, NULL);
    }

SQLite DB से पढ़ना:

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(init_statement, 6) length:sqlite3_column_bytes(init_statement, 6)];
        if(data == nil)
            NSLog(@"No image found.");
        else
            self.pictureImage = [UIImage imageWithData:data];   
29/01/2010 को 14:05
का स्रोत उपयोगकर्ता

वोट
0

आप पहली बार फाइल सिस्टम पर छवि लिखना चाहिए। और उसके बाद छवि पथ लेने के लिए और SQLite में पाठ के रूप में उस छवि पथ (यूआरएल) की दुकान।

27/05/2015 को 07:08
का स्रोत उपयोगकर्ता

वोट
0

सबसे अच्छा अभ्यास छवि को संपीड़ित और डेटाबेस फाइल प्रणाली में संग्रहीत करने के लिए है। आप छवि का संकल्प के बारे में परवाह नहीं है, तो आप आगे बढ़ सकते हैं और यहां तक ​​कि का उपयोग करके छवि का आकार:

   UIGraphicsBeginImageContext(newSize);  
   [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];   
   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();    
   UIGraphicsEndImageContext();

उसके बाद आप उपयोग कर सकते हैं UIImageJPEGRepresentationअधिकतम संपीड़न के लिए "0" के एक मूल्य के साथ jpeg छवियों के लिए। या आप उपयोग कर सकते हैं UIImagePNGRepresentationPNG छवियों के लिए

05/07/2012 को 13:21
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more