개발과삶2009/01/21 22:48
Database 접속
FMDatabase* db = [FMDatabase databaseWithPath:@"/company.db"];
if (![db open]) {
    NSLog(@"데이터베이스에 접속할 수 없습니다.");
    return false;
}
물론 company.db 파일이 있어야 합니다. 또한, 위의 코드만으로는 Application영역에 있는 db파일이 Document영역으로 자동 복사 되는 것도 아닙니다. 자세한 사항은 SQLiteBook 예제를 참고하세요. 추후 관련 자료는 정리해 보겠습니다.


데이터 베이스 접속이 되었다면 이제는 CRUD를 기준으로 예제와 함께 진행해보겠습니다.

Create
NSString *sql = @"INSERT INTO emp (empno, name, grade, salary, hiredate) VALUES (?, ?, ?, ?, ?)";

[db executeUpdate: sql,
     [NSNumber numberWithInt: 10240],
     @"홍길동",
     [NSNumber numberWithInt: 10],
     [NSNumber numberWithFloat:3250.03f],
     [NSDate date]
];
보시는 것과 같이 ?와 1:1 대응되도록 파라미터를 추가하게 됩니다. 단, 모든 파라미터는 객체형이어야 합니다.

또한, [db lastInsertRowId] 로 auto increment 값을 얻을 수 있습니다.

Read
NSString *sql = @"SELECT * FROM emp WHERE empno > ?";

FMResultSet *rs = [db executeQuery: sql, [NSNumber numberWithInt: 0]];

while ([rs next]) {
    NSLog(@"사번:%d, 사원명:%@, 직급코드:%d, 연봉:%f, 입사일:%@",
        [rs intForColumn:@"empno"],
        [rs stringForColumn:@"name"],
        [rs intForColumn:@"grade"],
        [rs doubleForColumn:@"salary"],
        [rs dateForColumn:@"hiredate"]
    );
}

[rs close];
전체 사원 목록을 가져오는 예제 입니다. empno > 0이라고 한 이유는 파라미터로 어떻게 넘기는 지 보여드리기 위한 것일 뿐 특별한 의미는 없습니다.
executeQuery의 결과로 FMResultSet을 가져오고 FMResultSet의 next 메소드를 계속 호출하면서 row를 한개씩 fetch하고 있습니다. 물론, 마지막에는 close 했습니다(중요하죠. 지원을 반납한다는 것은 말이죠).
SQLite의 API는 컬럼 순번으로만 데이터를 가져올 수 있었습니다. 그러나, FMDB는 @"empno"와 같이 컬럼명을 직접 지정해줄 수 있게 되어 있습니다. 그 편리성은 아마도 아실듯... JDBC 프로그래밍을 해보셨다면 문법이 많이 익숙하실 것입니다.

Update
NSString *sql = @"UPDATE emp SET grade=? WHERE empno=?";

[db executeUpdate: sql,
     [NSNumber numberWithInt: 20],
     [NSNumber numberWithInt: 10240]
];
INSERT를 보셨으니 새로울 것이 없죠? 비슷합니다.

Delete
NSString *sql = @"DELETE FROM emp WHERE empno=?";

[db executeUpdate: sql,
     [NSNumber numberWithInt: 10240]
];
구색을 맞추기 위해 DELETE도 넣어봤습니다.

Apple 개발자 사이트에서 샘플로 제공하는 SQLiteBook을 보시고 이 코드를 보시면 와~ 하실 겁니다(적어도 저는 와~했었습니다^^). Copy & Paste와 많은 수정을 거쳐야 하나의 SQL을 처리하는 루틴이 만들어졌었는데, 이제는 1분 이내에 데이터 패치를 하는 코드 작성이 가능해졌습니다.

소스코드가 공개되어 있으니 소스코드도 한 번 보시길 바랍니다. 약간의 오버헤드가 있을 듯 하나 무시하셔도 될 정도가 아닐까 생각합니다. 제가 소개한 내용은 기본적인 사용 방법일 뿐이고, 트랜잭션 처리나 에러처리 기능이 있으니 관심깊게 살펴보시면 좋을 듯 합니다.



저작자 표시 비영리 변경 금지
Posted by 종이비행기