티스토리 뷰

이번에는 이미지를 어플에서 다시 사용할 수 있도록 저장하는 방법에 대해 정리해 보도록 하겠습니다. 

아이폰에 데이터를 파일시스템에 저장하는 방법은 크게 4가지가 있습니다. 
Property List, Object Archive, SQLite3, 그리고 코어 데이터라는 것이 있는데요.
이 중에서 SQLite3를 사용하는 방법을 간략하게 살펴보면서 UIImage를 저장하고 불러오는 것을 설명하고자 합니다. 

SQLite3를 사용하기 위해서는 libsqlite3.dylib라는 이름의 동적 라이브러리 파일을 링크시켜야 합니다. 
"Groups & Files"의 "Framework"를 선택하고 Project 메뉴의 [Add to Project..]을 클릭합니다. 
그리고 시뮬레이터를 사용할 경우, 다음 파일을 추가합니다. 
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/user/lib 하위에 libsqlite3.dylib가 존재합니다. 

물론 디바이스로 테스트 할 경우에는 iPhoneSimulator.platform 대신 iPhoneOS.platform을 선택하시면 됩니다. 

실제 SQLite3를 사용하는 방법은 기본적으로 책에 다 설명 되어 있으니 직접 찾아보시도록 하시구. 
여기에서는 이미지를 Blob 형태로 저장하는 것만 설명하도록 할께요

먼저 테이블을 다음과 같이 생성합니다. 필드의 타입을 Blob으로 지정하면 이미지를 저장할 수 있습니다. 
아래 소스에 보면 MINI_IMAGE를 BLOB으로 선언한 것을 볼 수 있습니다.
  1. char *errorMsg;  
  2. NSString *createSQL = @"CREATE TABLE IF NOT EXISTS MINI_DATA   
  3.                     (ROW INTEGER PRIMARY KEY, MINI_IMAGE BLOB);";  
  4. if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg)   
  5.         != SQLITE_OK) {  
  6.     sqlite3_close(database);  
  7.     NSAssert1(0, @"Error creating table: %s", errorMsg);  
  8. }  
참고로 여기에서 database 변수는 sqlite3 *database로 선언된 것입니다. 

updateImage라는 메소드를 만들어서 이미지를 저장하는 소스는 다음과 같습니다.
(테이블 생성과 달리 SQL문을 char *로 선언해봤습니다. 이게 NSString 보다 변환이 없어 빠르다고는 하더라구요)
  1. - (void)updateImage {  
  2.     char *errorMsg;  
  3.     char *update = "INSERT OR REPLACE INTO MINI_DATA (ROW, MINI_IMAGE) VALUES (?, ?);";  
  4.     sqlite3_stmt *stmt;  
  5.     if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {  
  6.         sqlite3_bind_int(stmt, 11);  
  7.                  
  8.         // 여기서부터가 이미지를 저장하는 부분입니다.  
  9.         NSData *imgData = UIImagePNGRepresentation(self.backgroundImage);  
  10.           
  11.         int returnValue = -1;  
  12.         if (self.backgroundImage != nil)  
  13.             returnValue = sqlite3_bind_blob(stmt, 2, [imgData bytes], [imgData length], NULL);  
  14.         else   
  15.             returnValue = sqlite3_bind_blob(stmt, 2, nil, -1, NULL);  
  16.           
  17.         if (returnValue != SQLITE_OK)  
  18.             NSLog(@"Not OK!!!");  
  19.     }  
  20.       
  21.     if (sqlite3_step(stmt) != SQLITE_DONE)  
  22.         NSAssert1(0, @"Error updating table: %s", errorMsg);  
  23.     sqlite3_finalize(stmt);  
  24. }  

소스를 보시면 알겠지만 그리 어렵지 않습니다. 
UIImagePNGRepresentation 함수를 이용해서 UIImage 타입인 backgroundImage를 NSData로 변환합니다. 
그리고 나서 sqlite3_bind_blob을 사용해 저장하는 겁니다. 

참고로 헤더 파일에 UIImage *backgroundImage를 선언한 상태입니다. 
즉, 다른 곳에서 backgroundImage에 저장할 이미지를 지정하고 
[self updateImage]와 같이 호출하면 해당 이미지를 데이터베이스에 저장하는 구조입니다. 

마지막으로 저장된 이미지 데이터를 가져오는 소스를 살펴보면 다음과 같습니다. 
  1. NSString *query = @"SELECT ROW, MINI_IMAGE FROM MINI_DATA ORDER BY ROW";  
  2. sqlite3_stmt *statement;  
  3. if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {  
  4.     while (sqlite3_step(statement) == SQLITE_ROW) {  
  5.         int row = sqlite3_column_int(statement, 0);  
  6.   
  7.         // 이미지 데이터를 가져오는 부분입니다.           
  8.         NSData *data = [[NSData alloc]   
  9.                         initWithBytes:sqlite3_column_blob(statement, 1)   
  10.                         length:sqlite3_column_bytes(statement, 1)];  
  11.           
  12.         if(data == nil)  
  13.             NSLog(@"No image found.");  
  14.         else  
  15.             self.backgroundImage = [UIImage imageWithData:data];  
  16.           
  17.         [data release];           
  18.     }  
  19.     sqlite3_finalize(statement);  
  20. }  
저장할 때와 반대로 가져온 데이터를 NSData로 변경하고 이것을 UIImage로 바꿔서
backgroundImage에 할당하는 겁니다. 

어플 개발시 이미지를 저장해야 할 때가 간혹 있을 수 있을 듯 합니다.
이럴때 사용할 수 있는 간단한 방법을 정리해 봤습니다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함