Odczyt i zapis obrazów do SQLite DB do użytku iPhone

głosy
22

Wcześniej skonfigurować DB SQLite, które obecnie odczytuje i zapisuje NSStrings doskonale. Chcę również, aby zapisać obraz w bazie danych i przywołać je później. Czytałem trochę w górę w użyciu NSDatai kodowania obrazu, ale nie jestem do końca pewien, co składnia jest za to, co chcę robić. Wszelkie fragmenty kodu lub przykłady byłoby bardzo mile widziane.

Mój obecny proces idzie tak: UIImagePickerController-> Użytkownik wybiera obrazu z zdjęciach -> chosenImage jest ustawione na wystąpienie UIImageView-> Teraz chcę wziąć ten obraz i zapisać go w DB

Powinienem wspomnieć to wezwanie zostaną ostatecznie zastąpione połączenia ze zdalnym serwerem. Nie wiem, czy to robi różnicę jeśli chodzi o wydajność idzie.

Utwórz 13/03/2009 o 18:03
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
31

Musisz przekonwertować UIImage gospodarzem w swoim UIImageView do binarnego BLOB do przechowywania w SQLite. Aby to zrobić, można użyć następujących:

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

Spowoduje to wygenerowanie reprezentacji PNG swojego wizerunku, należy go przechowywać w instancji NSData, a następnie powiązać z NSData bajtów jako BLOB dla drugiego argumentu w zapytaniu SQL. Użyj UIImageJPEGRepresentation w wyżej zapisać w tym formacie, jeśli chcesz. Musisz mieć kolumnę BLOB dodany do odpowiedniej tabeli w bazie danych SQLite.

Aby pobrać ten obraz, można użyć następujących:

NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)];       
self.cachedImage = [UIImage imageWithData:dataForCachedImage];
[dataForCachedImage release];
Odpowiedział 13/03/2009 o 18:41
źródło użytkownik

głosy
9

zalecenie Apple nie jest do przechowywania BLOB jest w SQLite baz danych, które są większe niż około 2 kilobajtów.

SQLite organizuje baz danych na stronach. Każda strona jest 4 kilobajtów w rozmiarze. Podczas odczytu danych z pliku bazy danych SQLite ładuje te strony do wewnętrznej pamięci podręcznej stron. Na iPhone myślę Ta skrzynka domyślnie 1 MB w rozmiarze. To sprawia, że ​​czytanie sąsiadujące rekordy bardzo szybko, ponieważ będą one prawdopodobnie w pamięci podręcznej stron już.

Kiedy SQLite odczytuje rekord bazy danych do pamięci odczytuje całą płytę i wszystkich stron, że oscyluje. Więc jeśli płyta zawiera BLOB, może to zająć wiele stron i będzie wyrzucania istniejących stron z pamięci podręcznej i zastąpienie ich stronach rekord Blob.

To nie jest tak źle, jeśli jesteś po prostu poprzez skanowanie i załadunek wszystkie swoje Blobs coś zrobić z nimi (wyświetlanie ich na przykład). Ale jeśli mówisz, że zrobiłem kwerendę, gdzie po prostu chciał, aby uzyskać pewne dane, które są w tym samym wierszu jako BLOB kwerenda ta byłaby znacznie wolniej niż gdyby zapis nie zawierają dużą BLOB.

Tak przynajmniej należy przechowywać swoje dane BLOB w osobnej tabeli. Na przykład:

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

Albo jeszcze lepiej, przechowywania danych BLOB jak pliki poza bazą danych SQLite.

Należy pamiętać, że może to być możliwe, aby dostosować rozmiar strony z pamięci podręcznej instrukcji SQL PRAGMA (jeśli nie używasz CoreData).

Odpowiedział 15/04/2011 o 11:21
źródło użytkownik

głosy
9

Jedną z opcji (a na ogół korzystne przy pracy w SQL) to napisać obraz do pliku w systemie i zapisywać ścieżki (lub jakiś inny rodzaj identyfikatora) w bazie danych.

Odpowiedział 13/03/2009 o 18:32
źródło użytkownik

głosy
2

Pisanie obraz do 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);
    }

Czytanie 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];   
Odpowiedział 29/01/2010 o 14:05
źródło użytkownik

głosy
0

należy najpierw napisać obraz na systemie plików. a następnie podjąć ścieżkę obrazu i przechowywać tę ścieżkę obrazu (URL) jako tekst w SQLite.

Odpowiedział 27/05/2015 o 07:08
źródło użytkownik

głosy
0

Najlepszym rozwiązaniem jest, aby skompresować obraz i zapisać go w systemie baz danych lub plików. Jeśli nie dbają o rozdzielczości obrazu można iść do przodu, a nawet zmienić rozmiar obrazu za pomocą:

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

Po tym można używać UIImageJPEGRepresentationdo zdjęć w formacie JPEG o wartości „0” dla maksymalnej kompresji. Można też użyć UIImagePNGRepresentationdo PNG

Odpowiedział 05/07/2012 o 13:21
źródło użytkownik

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