Okuma ve iPhone kullanımı için SQLite DB görüntüleri yazma

oy
22

Şu anda okur ve yazar bir SQLite DB kurdum NSStringmükemmel s. Ayrıca veritabanında bir görüntü saklamak istediğiniz ve daha sonra hatırlama. Ben kullanımıyla ilgili biraz yukarı okudum NSDatave görüntü kodlama, ama sözdizimi yapmak istediğim şey için ne tamamen emin değilim. Herhangi bir kod parçalarını veya örnekler büyük takdir.

Benim şu anki süreç şöyledir: UIImagePickerController-> Kullanıcı Fotoğraflar'dan Resmi seçer -> chosenImage örneğine ayarlanır UIImageView> - Şimdi bu görüntüyü alıp DB saklamak istiyorum

Bu çağrı sonunda uzak sunucuya çağrısı ile değiştirilecektir belirtmeliyiz. Bu bildiğim kadarıyla performans gider gibi bir fark yaratır emin değilim.

Oluştur 13/03/2009 saat 18:03
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
31

Sen SQLite'ta depolama için ikili DAMLA içine UIImageView içinde barındırılan UIImage dönüştürmek gerekir. Bunu yapmak için, aşağıdaki kullanabilirsiniz:

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

Bu, görüntünüzün bir PNG temsilini oluşturmak bir NSData örneği depolamak ve sonra SQL sorgusunda ikinci argüman için bir BLOB olarak NSData gelen bayt bağlayacaktır. İstersen, bu biçimde saklamak için yukarıda UIImageJPEGRepresentation kullanın. Eğer SQLite veritabanında uygun tabloya eklenir BLOB sütunu olması gerekir.

Bu resmi almak için aşağıdakileri kullanabilirsiniz:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
Cevap 13/03/2009 saat 18:41
kaynak kullanıcı

oy
9

Apple'ın öneri ~ 2 kilobayt daha büyük SQLite veritabanlarında BLOB en saklamak için değil.

SQLite sayfalarına veritabanlarını düzenler. Her sayfa boyutunda 4 kilobayttır. Eğer SQLite veritabanı dosyasından veri okumak zaman iç sayfalardan önbelleğine bu sayfaları yükler. iPhone'da ben boyutu 1 megabayt için bu önbellek varsayılan düşünüyorum. Bu muhtemelen zaten sayfa önbellekte olacaktır çünkü çok hızlı komşu kayıtları okuma yapar.

SQLite belleğe veritabanı kaydını okuduğunda onu tüm kaydı ve kaplar tüm sayfaları okur. kaydınızın bir BLOB içeriyorsa Yani, birçok sayfa işgal olabilir ve önbellekten mevcut sayfaları çıkartma ve BLOB kaydın sayfaları ile bunların yerine edilecektir.

Eğer sadece üzerinden tarayıp onlarla bir şeyler (örneğin da ekran) yapmak için tüm lekeler yüklüyorsanız o kadar kötü değil. demek Ama eğer sadece bu sorgu rekor büyük BLOB içermiyormuşçasına çok daha yavaş olacağını DAMLA aynı satırda olduğunu bazı verileri almak isteyen bir sorgu yaptılar.

Yani en azından ayrı bir tabloda BLOB veri depolamak gerekir. Örneğin:

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

Ya da daha iyisi, SQLite veritabanında dışında dosyaları gibi BLOB verileri depolamak.

Onunla sayfa önbellek boyutunu oynamak mümkün olabileceğini unutmayın SQL PRAGMA ifadeleri (eğer CoreData kullanmıyorsanız).

Cevap 15/04/2011 saat 11:21
kaynak kullanıcı

oy
9

Seçeneklerden biri (ve SQL çalışırken genelde tercih edilir) sisteminde bir dosyaya görüntü yazmak ve veritabanındaki yolunu (veya tanımlayıcı başka türde) saklamaktır.

Cevap 13/03/2009 saat 18:32
kaynak kullanıcı

oy
2

SQLite DB Resmi Yazma

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 Gönderen Okuma:

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];   
Cevap 29/01/2010 saat 14:05
kaynak kullanıcı

oy
0

İlk dosya sisteminde görüntü yazmalı. ve sonra görüntü yolunu almak ve sqlite içinde METİN olarak o görüntü yolunu (URL) depolar.

Cevap 27/05/2015 saat 07:08
kaynak kullanıcı

oy
0

En iyi uygulama görüntüyü sıkıştırmak ve veritabanı veya dosya sisteminde bunu saklamaktır. Görüntünün çözünürlüğü umurumda değil ise devam edebilir ve hatta kullanarak görüntüyü yeniden boyutlandırabilirsiniz:

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

Bundan sonra kullanabilirsiniz UIImageJPEGRepresentationmaksimum sıkıştırma için "0" değerine sahip jpeg görüntüler için. Yoksa kullanabilirsiniz UIImagePNGRepresentationpng resimler için

Cevap 05/07/2012 saat 13:21
kaynak kullanıcı

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