سؤال

لقد أنشأت سكليتي DB حاليا يقرأ ويكتب NSStrings تماما.أنا أيضا أريد أن تخزين الصورة في قاعدة البيانات و يذكر ذلك في وقت لاحق.لقد قرأت قليلا على استخدام NSData و ترميز الصورة, ولكن أنا لست متأكدا تماما ما هو جملة ما أريد القيام به.أي مقتطفات الشفرة أو أمثلة سيكون موضع تقدير كبير.

بلدي الحالي عملية وغني عن مثل هذا:UIImagePickerController -> المستخدم يختار صورة من الصور -> chosenImage يتم تعيين إلى مثيل UIImageView -> الآن أريد أن أغتنم هذه الصورة وتخزينها في قاعدة البيانات

أود أن أذكر هذه الدعوة سوف يكون في نهاية المطاف استبدال الاتصال إلى ملقم بعيد.لست متأكدا إذا كان هذا يحدث فرقا بقدر الأداء يذهب.

هل كانت مفيدة؟

المحلول

خيار واحد (و عموما يفضل عند العمل في SQL) هو إرسال الصورة إلى ملف على نظام تخزين مسار (أو أي نوع آخر من معرف) في قاعدة البيانات.

نصائح أخرى

سوف تحتاج إلى تحويل UIImage استضافت داخل UIImageView في ثنائي النقطة للتخزين في SQLite.للقيام بذلك يمكنك استخدام التالية:

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

هذا سوف تولد PNG تمثيل الصورة ، تخزينه في NSData سبيل المثال ، ومن ثم ربط بايت من NSData ككائن عن الحجة الثانية في استعلام SQL.استخدام 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];

أبل التوصية بعدم تخزين النقطة في قواعد البيانات سكليتي التي هي أكبر من ~2 كيلو بايت.

سكليتي تنظم قواعد البيانات إلى صفحات.كل صفحة هو 4 كيلو بايت في الحجم.عند قراءة البيانات من ملف قاعدة بيانات SQLite يقوم بتحميل هذه الصفحات في صفحة داخلية ذاكرة التخزين المؤقت.على اي فون أعتقد أن هذا ذاكرة التخزين المؤقت الافتراضي إلى 1 ميغا بايت في الحجم.هذا يجعل القراءة المجاورة سجلات سريع جدا لأنها سوف تكون على الأرجح في صفحة ذاكرة التخزين المؤقت بالفعل.

عندما سكليتي يقرأ قاعدة البيانات الخاصة بك سجل في الذاكرة يقرأ السجل بأكمله و كل الصفحات التي تحتلها.حتى إذا كان السجل الخاص بك يحتوي على سائل ، يمكن أن تشغل العديد من الصفحات و سوف يكون إخراج الصفحات الموجودة من ذاكرة التخزين المؤقت واستبدالها النقطة الخاصة بك سجل صفحات.

هذا ليس سيئا للغاية إذا كنت مجرد المسح الضوئي من خلال تحميل جميع النقط الخاص بك أن تفعل شيئا معهم (عرض لهم على سبيل المثال).ولكن إذا قمت استعلام حيث كنت فقط أرغب في الحصول على بعض البيانات التي في نفس الصف كما BLOB هذا الاستعلام سيكون أبطأ بكثير مما لو سجل لم يتضمن كبير النقطة.

حتى في الحد الأدنى يجب أن تخزين البيانات BLOB في جدول منفصل.على سبيل المثال:

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) );

أو الأفضل من ذلك ، تخزين البيانات BLOB الملفات خارج قاعدة بيانات SQLite.

ملاحظة أنه قد يكون من الممكن أن يعدل صفحة حجم ذاكرة التخزين المؤقت مع SQL PRAGMA البيانات (إذا كنت لا تستخدم كوريداتا).

صورة الكتابة سكليتي 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);
    }

القراءة من سكليتي 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];   

يجب عليك أولا إرسال الصورة على نظام الملفات.ثم تأخذ مسار الصورة وتخزينها أن مسار الصورة(URL) كما نص في sqlite.

أفضل ممارسة ضغط الصورة و تخزينها في قاعدة بيانات أو نظام الملفات.إذا كنت لا تهتم حول القرار من الصورة يمكنك ان تمضي قدما و حتى تغيير حجم الصورة عن طريق استخدام :

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

بعد ذلك يمكنك استخدام UIImageJPEGRepresentation على الصور jpeg مع قيمة "0" لأقصى قدر من الضغط.أو يمكنك استخدام UIImagePNGRepresentation على الصور png

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top