Čte a zapisuje obrázky do SQLite DB pro iPhone

hlasů
22

Nastavil jsem si SQLite DB, který v současné době čte a zapisuje NSStringto perfektně. Také chci uložit obraz do databáze a vyvolat později. Četl jsem se trochu o používání NSDataa kódování obrazu, ale nejsem si úplně jistý, co je syntaxe pro to, co chci dělat. Jakékoliv kousky kódu nebo příklady by bylo velmi ocenil.

Můj současný proces vypadá takto: UIImagePickerController-> uživatel vybere obrázek z aplikace Fotografie -> chosenImage nastaven na instanci UIImageView-> Teď chci, aby tento snímek a uložit jej v DB

Měl bych zmínit, toto volání bude nakonec nahrazen volání na vzdálený server. Není si jistý, jestli to dělá rozdíl, pokud jde o výkon jde.

Položena 13/03/2009 v 18:03
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
31

Budete muset převést UIImage hostované přímo ve Vašem UIImageView do binární BLOB ke skladování v SQLite. K tomu můžete použít následující:

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

To bude generovat reprezentaci PNG vašeho obrazu, uložte jej v instanci NSData, a pak svázat bajtů z NSData jako BLOB pro druhý argument v SQL dotazu. Použijte UIImageJPEGRepresentation ve výše uložit v tomto formátu, pokud se vám líbí. Budete muset mít BLOB sloupec přidán do příslušné tabulky v SQLite databáze.

K získání tohoto snímku, můžete použít následující:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
Odpovězeno 13/03/2009 v 18:41
zdroj uživatelem

hlasů
9

Apple doporučení není ukládat BLOB je v SQLite databáze, které jsou větší než ~ 2 kilobajtů.

SQLite databáze organizuje do stran. Každá stránka je 4 kB velikost. Když budete číst data ze souboru databáze SQLite načte tyto stránky do interní paměti cache stránky. Na iPhone Myslím, že tato vyrovnávací paměti výchozí hodnota je 1 megabajt ve velikosti. To dělá čtení sousedních záznamů velmi rychle, protože budou pravděpodobně v cache stránek již.

Když SQLite čte databázový záznam do paměti přečte celý záznam a všechny stránky, které zabírá. Takže pokud váš záznam obsahuje BLOB, může to zabírat mnoho stránek a budete vysunutím stávající stránky z cache a jejich nahrazení stránkách svého blob rekord je.

To není tak špatné, pokud jste právě skenování až do konce a nahrává všechny vaše bloby udělat něco s nimi (jejich zobrazení například). Ale v případě, že jste udělal dotaz, kde si jen chtěli získat nějaké informace, která je ve stejném řádku jako BLOB Tento dotaz by byl mnohem pomalejší než v případě, že záznam neobsahoval velký BLOB.

Takže minimálně je třeba ukládat data BLOB v samostatné tabulce. Např:

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

Nebo ještě lépe, uložit data BLOB jako soubory mimo databázi SQLite.

Všimněte si, že je možné vyladit velikost stránky vyrovnávací paměti s SQL Pragma závěrky (pokud nepoužíváte CoreData).

Odpovězeno 15/04/2011 v 11:21
zdroj uživatelem

hlasů
9

Jednou z možností (a obecně dává přednost při práci v SQL), je napsat obrazu do souboru v systému a uložit cestu (nebo nějaký jiný druh identifikátoru) v databázi.

Odpovězeno 13/03/2009 v 18:32
zdroj uživatelem

hlasů
2

Psaní na obrázek 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);
    }

Čtení z 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];   
Odpovězeno 29/01/2010 v 14:05
zdroj uživatelem

hlasů
0

měli byste nejprve zapsat na disk v souborovém systému. a pak jít cestou obrazu a uložení tohoto obrazu cestu (URL) jako text v SQLite.

Odpovězeno 27/05/2015 v 07:08
zdroj uživatelem

hlasů
0

Nejlepší praxe je pro kompresi obrazu a uložit jej do databáze nebo systému souborů. Pokud nechcete starat o rozlišení obrazu můžete jít dopředu a dokonce změnit velikost obrázku pomocí:

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

Poté, které můžete použít UIImageJPEGRepresentationpro JPEG snímků s hodnotou „0“ pro maximální kompresi. Nebo můžete použít UIImagePNGRepresentationpro PNG

Odpovězeno 05/07/2012 v 13:21
zdroj uživatelem

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