Olvasása és írása a képeket egy SQLite DB iPhone használatát

szavazat
22

Hoztam létre egy SQLite DB, hogy jelenleg olvas és ír NSStrings tökéletesen. Azt is szeretnénk tárolni egy képet az adatbázisban, és emlékszem, hogy később. Olvastam egy kicsit használatával NSDataés kódoló képet, de nem vagyok teljesen biztos benne, mi a szintaxis, amit én akarok. Bármilyen kódtöredékek vagy példákra lenne nagyon méltányol.

A jelenlegi folyamat megy, mint ez: UIImagePickerController-> felhasználó kiválasztja Kép Képek -> chosenImage beállítása példánya UIImageView-> Most azt akarom, hogy ezt a képet, és tárolja azt a DB

Meg kell említenem, ezt a hívást utóbb ki kell cserélni egy hívást, hogy egy távoli szerverre. Nem biztos, hogy ez teszi a különbséget, mint amennyire a teljesítmény megy.

A kérdést 13/03/2009 18:03
a forrás felhasználó
Más nyelveken...                            


6 válasz

szavazat
31

El kell átalakítani a UIImage házigazdája az Ön UIImageView egy bináris BLOB tárolás céljából SQLite. Ehhez, akkor használhatja a következő:

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

Ez létrehoz egy PNG ábrázolását a kép, tárolja azt egy NSData példányt, majd megkötik a bájtot a NSData BLOB a második érv az SQL lekérdezés. Használja UIImageJPEGRepresentation a fenti tárolni ebben a formátumban, ha úgy tetszik. Lesz szükség van egy BLOB oszlopban adjuk a megfelelő táblázat az SQLite adatbázisban.

Ahhoz, hogy megkapja ezt a képet, akkor a következő:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
Válaszolt 13/03/2009 18:41
a forrás felhasználó

szavazat
9

Apple ajánlás nem tárolja BLOB azon az SQLite adatbázisok, amelyek nagyobbak, mint ~ 2 kilobyte.

SQLite szervezi adatbázisokat oldalakon. Minden oldalon 4 kilobájt méretű. Ha olvasni az adatokat a SQLite adatbázis fájlt betölti ezeket az oldalakat egy belső oldal cache. Az iPhone Azt hiszem, ez gyorsítótár alapértelmezés szerint 1 megabájt méretű. Ez teszi olvasás szomszédos bejegyzések nagyon gyorsan, mert valószínűleg az oldal cache már.

Amikor SQLite beolvassa az adatbázis rekord a memóriába beolvassa a teljes rekord és az összes oldalt, hogy elfoglalja. Tehát, ha a rekord tartalmaz egy BLOB, lehetett elfoglalni sok oldalt, és akkor kiveszi a meglévő oldalakat a cache, és helyettük a BLOB rekord oldalakon.

Ez nem is olyan rossz, ha csak olvas keresztül, és betölti az összes festékfoltok, hogy tegyen valamit velük (megjeleníti azokat például). De ha mondjuk te egy lekérdezést, ahol csak akart néhány adat, amely ugyanabban a sorban, mint a BLOB ez a lekérdezés lenne sokkal lassabb, mint ha a rekord nem tartalmazza a nagy BLOB.

Így legalább meg kell tárolni a BLOB adatok külön táblázatban. Például:

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

Vagy még jobb, tárolja a BLOB adatok fájlként kívül SQLite adatbázisban.

Megjegyezzük, hogy akkor lehet, hogy a csípés oldal cache méretű SQL PRAGMA nyilatkozatok (ha éppen nem használja CoreData).

Válaszolt 15/04/2011 11:21
a forrás felhasználó

szavazat
9

Az egyik lehetőség (és általában előnyös, ha dolgozik SQL), hogy írjon a képet egy fájlt a rendszer tárolja az utat (vagy valamilyen más azonosítót) az adatbázisban.

Válaszolt 13/03/2009 18:32
a forrás felhasználó

szavazat
2

Írásban Image 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);
    }

Olvasása 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];   
Válaszolt 29/01/2010 14:05
a forrás felhasználó

szavazat
0

először meg kell írni a képet fájlrendszert. majd megteszi a kép elérési útját, és tárolja, hogy a kép elérési útját (URL) szövegként SQLite.

Válaszolt 27/05/2015 07:08
a forrás felhasználó

szavazat
0

A legjobb gyakorlat az, hogy tömöríteni a képet, és tárolja az adatbázis és a fájlrendszer. Ha nem érdekel a kép felbontása akkor megy előre, és még lakik a kép segítségével:

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

Ezután használhatja UIImageJPEGRepresentationa JPEG képeket egy érték „0” a maximális tömörítés. Vagy használhatja UIImagePNGRepresentationa png képek

Válaszolt 05/07/2012 13:21
a forrás felhasználó

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