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

AND

요즘은 어디 나갈 때 핸드폰보다 터치를 더 챙기게 되었습니다. NDS도 있지만 아기자기한 게임들을 기울기와 터치로 즐기는 색다른 재미에, 가족들 사이에서도 터치의 게임이 훨씬 더 인기가 좋습니다. 제가 요즘 터치에서 가장 즐겨하는 게임은 Smallware에서 나온 Sol Free라는 카드게임입니다. (유료지만 무료 버젼도 있습니다.) 화장실에도 들고 갑니다. ^^;;


이전에 윈도우에서도 심심풀이로 많이 했지만, 터치에서는 직접 손으로 카드를 옮기고 넘기는 손맛때문에 한층 재미가 더 한 것 같습니다. 컴퓨터의 마우스로는 이 맛이 느낄 수 없어 재미가 없습니다.

다음으로 Rocking Porket Games에서 나온 Blue Skies란 게임도 간혹 하고 있습니다. 유료게임이지만 무료로된 lite 버젼을 설치하였습니다. 대공과 대지 공격을 하는 헬리콥터를 조정하여 적들을 찾아 파괴하는 게임입니다. 기울여서 방향을 조종하기 때문에 조금 반응이 늦는 감은 있지만, 헬리콥터의 움직임과는 잘 어울리는 것 같습니다.

그리고 오늘 App 스토어에서 또 다른 재미있는 게임을 찾았습니다. 작년 초에 아이맥에서 가끔 하고 저의 다른 블로그에서도 소개했던 3D 슈팅게임인 sauerbraten이 아이폰, 터치용으로 포팅이 되어 sauerbraten의 이전 이름인 Cube란 게임으로 나왔습니다.


위는 터치에서 캡쳐한 게임화면입니다. 터치를 돌리면서 진행 방향을 정하고 아래와 같이 외각을 터치해서 움직이고 총을 쏘고 점프를 할 수 있습니다.


이전에 컴퓨터에서 했던 게임을 똑같이 터치에서 할 수 있다는게 신기하긴 하지만, 컨트롤이 터치에서 제가 하기엔 너무 어려운 것 같습니다. 익숙해지면 좀 나아질지 모르겠습니다. PC용 버젼은 전체소스가 공개되어 있는데 터치용 버젼의 소스는 공개가 되지 않은 것 같습니다.

한번씩 App 스토어를 들어가면 이런 재미있는 공짜 게임들이 많이 올라오니, 사용자 입장에선 참 행복하고 고마운 일입니다. 이제는 초기에 비해서 완성도가 꽤나 높은 게임들이 무료나 lite 버젼으로 많이 올라오고 있는 것 같습니다.

애플은 아이폰 개발자 유니버시티 프로그램을 추가하여 대학생들이 공부를 목적으로 무료로 아이폰 어플리케이션을 사용하고 기기에서 테스트 해 볼 수 있는 지원을 하고 있습니다. 이와 마찬가지로 공개 소프트웨어 개발자에게도 무료 개발자 프로그램 등록과 같은 혜택을 주었으면 좋겠습니다.
AND

iOS 2008. 11. 22. 14:33
오늘 맥을 켜니 아이튠즈와 함께 아이팟 터치 펌웨어도 2.2로 업그레이드 되었습니다. 애플 사이트에서 가져온 아이폰 펌웨어 2.2에서 변경된 내역은 아래와 같습니다.

* Enhancements to Maps
  • Google Street View*
  • Public transit and walking directions
  • Display address of dropped pins
  • Share location via email
* Decrease in call setup failures and dropped calls

* Enhancements to Mail
  • Resolved isolated issues with scheduled fetching of email
  • Improved formatting of wide HTML email
* Podcasts are now available for download in iTunes application (over Wi-Fi and cellular network)

* Improved stability and performance of Safari

* Improved sound quality of Visual Voicemail messages

* Pressing Home button from any Home screen displays the first Home screen

* Preference to turn on/off auto-correction in Keyboard Settings

사파리로 브라우징시에 간혹 튕기는 현상이 있었는데, 사파리의 안정화 부분 정도에만 눈길이 가네요. 캘린더에 TODO 기능과 iCal과의 동기화가 되었으면 좋겠는데, 애플에서 언제쯤 넣어줄지 모르겠습니다.

완료후에 iPhone DevCenter로 가보니 역시 SDK도 동일하게 2.2로 업그레이드 되었습니다. SDK를 새로 설치하니 Xcode도 3.1.1에서 3.1.2로 업그레이드 되었습니다.

IDE나 Core의 버젼이 올라갔지만 펌웨어에 맞추어 2.2로 업그레이된 것을 제외하고는 문서를 읽어보아도, 실행해서 대충 둘러 보아도 눈에 뛰게 변경된 점은 없는 것 같습니다.
AND