티스토리 뷰
이번에는 이미지를 어플에서 다시 사용할 수 있도록 저장하는 방법에 대해 정리해 보도록 하겠습니다.
아이폰에 데이터를 파일시스템에 저장하는 방법은 크게 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으로 선언한 것을 볼 수 있습니다.
- char *errorMsg;
- NSString *createSQL = @"CREATE TABLE IF NOT EXISTS MINI_DATA
- (ROW INTEGER PRIMARY KEY, MINI_IMAGE BLOB);";
- if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg)
- != SQLITE_OK) {
- sqlite3_close(database);
- NSAssert1(0, @"Error creating table: %s", errorMsg);
- }
참고로 여기에서 database 변수는 sqlite3 *database로 선언된 것입니다.
updateImage라는 메소드를 만들어서 이미지를 저장하는 소스는 다음과 같습니다.
(테이블 생성과 달리 SQL문을 char *로 선언해봤습니다. 이게 NSString 보다 변환이 없어 빠르다고는 하더라구요)
- - (void)updateImage {
- char *errorMsg;
- char *update = "INSERT OR REPLACE INTO MINI_DATA (ROW, MINI_IMAGE) VALUES (?, ?);";
- sqlite3_stmt *stmt;
- if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
- sqlite3_bind_int(stmt, 1, 1);
- // 여기서부터가 이미지를 저장하는 부분입니다.
- NSData *imgData = UIImagePNGRepresentation(self.backgroundImage);
- int returnValue = -1;
- if (self.backgroundImage != nil)
- returnValue = sqlite3_bind_blob(stmt, 2, [imgData bytes], [imgData length], NULL);
- else
- returnValue = sqlite3_bind_blob(stmt, 2, nil, -1, NULL);
- if (returnValue != SQLITE_OK)
- NSLog(@"Not OK!!!");
- }
- if (sqlite3_step(stmt) != SQLITE_DONE)
- NSAssert1(0, @"Error updating table: %s", errorMsg);
- sqlite3_finalize(stmt);
- }
소스를 보시면 알겠지만 그리 어렵지 않습니다.
UIImagePNGRepresentation 함수를 이용해서 UIImage 타입인 backgroundImage를 NSData로 변환합니다.
그리고 나서 sqlite3_bind_blob을 사용해 저장하는 겁니다.
참고로 헤더 파일에 UIImage *backgroundImage를 선언한 상태입니다.
즉, 다른 곳에서 backgroundImage에 저장할 이미지를 지정하고
[self updateImage]와 같이 호출하면 해당 이미지를 데이터베이스에 저장하는 구조입니다.
마지막으로 저장된 이미지 데이터를 가져오는 소스를 살펴보면 다음과 같습니다.
- NSString *query = @"SELECT ROW, MINI_IMAGE FROM MINI_DATA ORDER BY ROW";
- sqlite3_stmt *statement;
- if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
- while (sqlite3_step(statement) == SQLITE_ROW) {
- int row = sqlite3_column_int(statement, 0);
- // 이미지 데이터를 가져오는 부분입니다.
- NSData *data = [[NSData alloc]
- initWithBytes:sqlite3_column_blob(statement, 1)
- length:sqlite3_column_bytes(statement, 1)];
- if(data == nil)
- NSLog(@"No image found.");
- else
- self.backgroundImage = [UIImage imageWithData:data];
- [data release];
- }
- sqlite3_finalize(statement);
- }
저장할 때와 반대로 가져온 데이터를 NSData로 변경하고 이것을 UIImage로 바꿔서
backgroundImage에 할당하는 겁니다.
어플 개발시 이미지를 저장해야 할 때가 간혹 있을 수 있을 듯 합니다.
이럴때 사용할 수 있는 간단한 방법을 정리해 봤습니다.
'프로그래밍' 카테고리의 다른 글
모바일 기기 플랫폼 동향~ (0) | 2011.12.09 |
---|---|
맥북과 윈도우에서 마우스와 키보드를 공유해서 사용하는 도구 Synergy.. (0) | 2011.11.11 |
3G 네트워크의 속도를 알아보자. (0) | 2011.09.05 |
MAC과 PC간의 파일 공유 (1) | 2011.05.18 |
아이폰 개발시 문자열에 정규식을 사용하기 (6) | 2010.02.04 |