iOS 2008. 11. 25. 14:18
SQLite는 경량화된 DB로 맥과 아이폰/아이팟 터치에 기본적으로 내장되어 편리하게 사용할 수 있습니다. 자세한 내용은 SQLite 공식 홈페이지와 아래의 문서들을 참조하시면 도움이 되실 것입니다.


이와함께 애플의 iPhoneDev Center SQLite Book List란 샘플을 보시면, 아이폰 SDK에서 사용하는 방법이 잘 나와있습니다. SQLite의 개발자인 Richard Hipp이 구글 테크토크에서 직접 SQLite에 대해서 설명하는 'An Introducion to SQLite'란 동영상도 참고하면 좋습니다.



아래는 제가 SQLite를 테스트 해보기 위해 만들어 본 간단한 샘플코드입니다. 아이폰에서 사용자로 부터 입력을 받은 후에 SQLite DB에 저장하는 간단한 샘플입니다. DB를 오픈하는 부분과 SELECT, INSERT하는 부분만 참고하시면 쉽게 사용하실 수 있습니다.

* SQLiteTestAppDelegate.h
#import <UIKit/UIKit.h>
#import <sqlite3.h>

@interface SQLiteTestAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    sqlite3 *db;
    NSMutableArray *dataList;

    IBOutlet UITextField *newString;
    IBOutlet UITableView *dataTable;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

- (void)updateDataList;

- (IBAction)addRow:(id)sender;
   
@end


SQLiteTestAppDelegate.m
#import "SQLiteTestAppDelegate.h"

@implementation SQLiteTestAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(UIApplication *)application {   

    // Override point for customization after application launch
    [window makeKeyAndVisible];
   
    /* 어플리케이션 패스를 구한다. */    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mydata.db"];
       
    /* 데이터베이스를 오픈한다 */
    if(sqlite3_open([path UTF8String], &db) == SQLITE_OK) {
        char *error = NULL;
        const char* query = "SELECT count(*) from mytable";
       
        /* mytable을 쿼리해보고 오류가 있으면 mytable을 생성한다. */
        if (sqlite3_exec(db, query, NULL, 0, &error) != SQLITE_OK) {
            sqlite3_free(error);
           
            /* 테이블 생성 */
            if (sqlite3_exec(db, "CREATE TABLE mytable ('name' CHAR(16))", NULL, 0, &error) != SQLITE_OK) {
                NSLog(@"TABLE CREATE ERROR: %s", error);
                sqlite3_free(error);
            }   
        }
    } else {
        /* DB 오픈 에러 */
        sqlite3_close(db);
        db = NULL;
       
        NSLog(@"DB OPEN ERROR: '%s'", sqlite3_errmsg(db));   
    }
   
    dataList = [[NSMutableArray alloc] initWithCapacity:100];
   
    [self updateDataList];
}

- (void)applicationWillTerminate:(UIApplication *)application {
    if (db) {
        sqlite3_close(db);
    }
}

- (void)dealloc {
    [dataList release];
   
    [window release];
    [super dealloc];
}

/** 현재 DB에 있는 데이터를 dataList에 등록 */
- (void)updateDataList {
   
    /* 이전 데이터를 모두 삭제 */
    [dataList removeAllObjects];
   
    const char *query = "SELECT name FROM mytable";
    sqlite3_stmt *statement;
   
    if (sqlite3_prepare_v2(db, query, -1, &statement, NULL) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
           
            /* dataList에 쿼리결과 등록 */
            NSString* str = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
            [dataList addObject:str];
            [str release];
        }
    }
    sqlite3_finalize(statement);

    [dataTable reloadData];
}


#pragma mark IBACTION

- (IBAction)addRow:(id)sender {

    char *error = NULL;
   
    /* 사용자가 입력한 값을 DB에 추가한다 */
    NSString *query = [NSString stringWithFormat:@"INSERT INTO mytable VALUES ('%@')", [newString text]];
    sqlite3_exec(db, [query UTF8String], NULL, 0, &error);
   
    [self updateDataList];
}


#pragma mark TextField Delegate method

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
   
    [textField resignFirstResponder];
    return YES;
}


#pragma mark TableView Delegate method

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return @"Table Items";
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [dataList count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   
    static NSString *cellIdentifier = @"Cell";
   
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease];
    }
    cell.text = [dataList objectAtIndex:indexPath.row];
   
    return cell;
}

@end

모든 댓글을 환영합니다. (욕설과 광고는 삭제합니다.)
  1. Favicon of http://wookay.egloos.com BlogIcon ㄴㅇㄱ 2008.11.25 16:52  댓글주소  수정/삭제  댓글쓰기

    SQLitePersistentObjects 추천합니다. ;)
    예제 만들어 봤어요
    http://github.com/wookay/touching/tree/master/Persistencia

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2008.11.25 17:32 신고  댓글주소  수정/삭제

      소스까지 공개해 주셨네요. 단순한 SQLite 래퍼 클래스인줄 알았는데, 대충 보니 뭔지 모르지만 복잡하네요. ^^;; 나중에 천천히 한번 봐야겠습니다.

      좋은 정보와 소스를 제공해 주셔서 감사합니다. :)

  2. Favicon of http://hssuh.tistory.com BlogIcon 환수 2008.11.27 11:27  댓글주소  수정/삭제  댓글쓰기

    아. SQLite가 아이폰에도 기본으로 들어가는군요... 오버헤드가 별로 크지 않은가 보네요.

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2008.11.27 16:57 신고  댓글주소  수정/삭제

      네, 그런가 봅니다. :)

      SQLite는 맥에서도 지원하니 맥 어플리케이션에서 데이터를 가공하여 DB 파일을 생성하고, 아이폰 어플에서 오픈만 하여 보여주면되니 관련 어플리케이션을 만들기가 쉽더라고요.

  3. 초보개발자 2011.06.09 11:00  댓글주소  수정/삭제  댓글쓰기

    구글 검색을 통해 내가 원하는 화면 구성의 이미지를 발견하고 들어왔습니다.. ^^
    iphone splite 라고 검색을 하니 이게 나오더군요... ^^
    학교에서 splite를 배우지도 않았는데, 이걸 써서 만들어오라네요... ㅜㅜ
    저는 DB쪽으로 이론만 조금 배웠는데, 어떻게 사용하는지 도저히 모르겠네요!
    저한테 도움을 주실수 있는지 몰겠지만 글을 남겨봅니다...
    davius@hanmail.net 제 메일 주소인데, splite 의 기본적인 개념을 잡고 iphone에 적용하는 방법을 가르쳐주시면 감사하겠습니다. ^^