Database 접속
데이터 베이스 접속이 되었다면 이제는 CRUD를 기준으로 예제와 함께 진행해보겠습니다.
Create
또한, [db lastInsertRowId] 로 auto increment 값을 얻을 수 있습니다.
Read
executeQuery의 결과로 FMResultSet을 가져오고 FMResultSet의 next 메소드를 계속 호출하면서 row를 한개씩 fetch하고 있습니다. 물론, 마지막에는 close 했습니다(중요하죠. 지원을 반납한다는 것은 말이죠).
SQLite의 API는 컬럼 순번으로만 데이터를 가져올 수 있었습니다. 그러나, FMDB는 @"empno"와 같이 컬럼명을 직접 지정해줄 수 있게 되어 있습니다. 그 편리성은 아마도 아실듯... JDBC 프로그래밍을 해보셨다면 문법이 많이 익숙하실 것입니다.
Update
Delete
Apple 개발자 사이트에서 샘플로 제공하는 SQLiteBook을 보시고 이 코드를 보시면 와~ 하실 겁니다(적어도 저는 와~했었습니다^^). Copy & Paste와 많은 수정을 거쳐야 하나의 SQL을 처리하는 루틴이 만들어졌었는데, 이제는 1분 이내에 데이터 패치를 하는 코드 작성이 가능해졌습니다.
소스코드가 공개되어 있으니 소스코드도 한 번 보시길 바랍니다. 약간의 오버헤드가 있을 듯 하나 무시하셔도 될 정도가 아닐까 생각합니다. 제가 소개한 내용은 기본적인 사용 방법일 뿐이고, 트랜잭션 처리나 에러처리 기능이 있으니 관심깊게 살펴보시면 좋을 듯 합니다.
FMDatabase* db = [FMDatabase databaseWithPath:@"/company.db"];
if (![db open]) {
NSLog(@"데이터베이스에 접속할 수 없습니다.");
return false;
}
물론 company.db 파일이 있어야 합니다. 또한, 위의 코드만으로는 Application영역에 있는 db파일이 Document영역으로 자동 복사 되는 것도 아닙니다. 자세한 사항은 SQLiteBook 예제를 참고하세요. 추후 관련 자료는 정리해 보겠습니다.if (![db open]) {
NSLog(@"데이터베이스에 접속할 수 없습니다.");
return false;
}
데이터 베이스 접속이 되었다면 이제는 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 executeUpdate: sql,
[NSNumber numberWithInt: 10240],
@"홍길동",
[NSNumber numberWithInt: 10],
[NSNumber numberWithFloat:3250.03f],
[NSDate date]
];
또한, [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"]
);
전체 사원 목록을 가져오는 예제 입니다. empno > 0이라고 한 이유는 파라미터로 어떻게 넘기는 지 보여드리기 위한 것일 뿐 특별한 의미는 없습니다.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];
[rs close];
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를 보셨으니 새로울 것이 없죠? 비슷합니다.[db executeUpdate: sql,
[NSNumber numberWithInt: 20],
[NSNumber numberWithInt: 10240]
];
Delete
NSString *sql = @"DELETE FROM emp WHERE empno=?";
[db executeUpdate: sql,
[NSNumber numberWithInt: 10240]
];
구색을 맞추기 위해 DELETE도 넣어봤습니다.[db executeUpdate: sql,
[NSNumber numberWithInt: 10240]
];
Apple 개발자 사이트에서 샘플로 제공하는 SQLiteBook을 보시고 이 코드를 보시면 와~ 하실 겁니다(적어도 저는 와~했었습니다^^). Copy & Paste와 많은 수정을 거쳐야 하나의 SQL을 처리하는 루틴이 만들어졌었는데, 이제는 1분 이내에 데이터 패치를 하는 코드 작성이 가능해졌습니다.
소스코드가 공개되어 있으니 소스코드도 한 번 보시길 바랍니다. 약간의 오버헤드가 있을 듯 하나 무시하셔도 될 정도가 아닐까 생각합니다. 제가 소개한 내용은 기본적인 사용 방법일 뿐이고, 트랜잭션 처리나 에러처리 기능이 있으니 관심깊게 살펴보시면 좋을 듯 합니다.