iOS 학습 노트(16)―데이터베이스 조작 상세 설명(FMDB 사용)
FMDB 에서 파일 을 다운로드 한 후 프로젝트 에서 다음 파일 을 가 져 오고 libsqlite3.dylib 의존 패 키 지 를 사용 해 야 합 니 다.
FMDB 는 ARC 와 비 ARC 프로젝트 를 동시에 호 환 하 며,프로젝트 설정 에 따라 해당 메모리 관리 코드 를 자동 으로 조정 합 니 다.
FMDB 상용 클래스:
db = [FMDatabase databaseWithPath:database_path];
1.데이터베이스 파일 이 존재 하지 않 을 때 fmdb 는 스스로 하 나 를 만 듭 니 다.2.들 어 오 는 인자 가 빈 문자열 이 라면 fmdb 는 임시 파일 디 렉 터 리 에서 이 데이터 베 이 스 를 만 듭 니 다.데이터 베 이 스 는 연결 이 끊 겼 을 때 데이터베이스 파일 이 삭 제 됩 니 다.
3.만약 에 들 어 온 인자 가 NULL 이 라면 메모리 에 있 는 데이터 베 이 스 를 만 들 것 입 니 다.데이터 베 이 스 는 연결 이 끊 겼 을 때 데이터 베이스 파일 이 삭 제 됩 니 다.
데이터베이스 열기:
[db open]
BOOL 형 으로 돌아 갑 니 다.데이터베이스 닫 기:
[db close]
데이터베이스 삭제 등 작업:조회 작업 을 제외 하고 FMDB 데이터베이스 작업 은 모두 execute Update 방법 을 실행 하 며 이 방법 은 BOOL 형 으로 되 돌아 갑 니 다.
예 를 들 어:
생 성 표:
if ([db open]) {
NSString *sqlCreateTable = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' INTEGER PRIMARY KEY AUTOINCREMENT, '%@' TEXT, '%@' INTEGER, '%@' TEXT)",TABLENAME,ID,NAME,AGE,ADDRESS];
BOOL res = [db executeUpdate:sqlCreateTable];
if (!res) {
NSLog(@"error when creating db table");
} else {
NSLog(@"success to creating db table");
}
[db close];
}
데이터 추가:
if ([db open]) {
NSString *insertSql1= [NSString stringWithFormat:
@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
TABLENAME, NAME, AGE, ADDRESS, @" ", @"13", @" "];
BOOL res = [db executeUpdate:insertSql1];
NSString *insertSql2 = [NSString stringWithFormat:
@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
TABLENAME, NAME, AGE, ADDRESS, @" ", @"12", @" "];
BOOL res2 = [db executeUpdate:insertSql2];
if (!res) {
NSLog(@"error when insert db table");
} else {
NSLog(@"success to insert db table");
}
[db close];
}
데이터 수정:
if ([db open]) {
NSString *updateSql = [NSString stringWithFormat:
@"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",
TABLENAME, AGE, @"15" ,AGE, @"13"];
BOOL res = [db executeUpdate:updateSql];
if (!res) {
NSLog(@"error when update db table");
} else {
NSLog(@"success to update db table");
}
[db close];
}
데이터 삭제:
if ([db open]) {
NSString *deleteSql = [NSString stringWithFormat:
@"delete from %@ where %@ = '%@'",
TABLENAME, NAME, @" "];
BOOL res = [db executeUpdate:deleteSql];
if (!res) {
NSLog(@"error when delete db table");
} else {
NSLog(@"success to delete db table");
}
[db close];
}
데이터베이스 조회 작업:검색 작업 은 executeQuery 를 사 용 했 고 FM ResultSet 과 관련 되 었 습 니 다.
if ([db open]) {
NSString * sql = [NSString stringWithFormat:
@"SELECT * FROM %@",TABLENAME];
FMResultSet * rs = [db executeQuery:sql];
while ([rs next]) {
int Id = [rs intForColumn:ID];
NSString * name = [rs stringForColumn:NAME];
NSString * age = [rs stringForColumn:AGE];
NSString * address = [rs stringForColumn:ADDRESS];
NSLog(@"id = %d, name = %@, age = %@ address = %@", Id, name, age, address);
}
[db close];
}
FMDB 의 FMResultSet 은 다양한 종류의 데 이 터 를 얻 을 수 있 는 여러 가지 방법 을 제공 합 니 다.데이터베이스 다 중 스 레 드 작업:
응용 프로그램 에서 다 중 스 레 드 로 데이터 베 이 스 를 조작 했다 면,FMDatabaseQueue 를 사용 하여 스 레 드 안전 을 확보 해 야 합 니 다.응용 프로그램 에서 여러 스 레 드 에서 하나의 FMDatabase 대상 을 공동으로 사용 하여 데이터 베 이 스 를 조작 하면 데이터 베 이 스 를 혼 란 스 럽 게 할 수 없습니다.다 중 스 레 드 로 데이터 베 이 스 를 안전하게 조작 하기 위해 FMDB 는 FMDatabaseQueue 를 사 용 했 습 니 다.FMDatabaseQueue 를 사용 하 는 것 은 간단 합 니 다.먼저 하나의 데이터베이스 파일 주소 로 FMDatabaseQueue 를 초기 화한 다음 에 하나의 패 킷(block)을 inDatabase 방법 에 전송 할 수 있 습 니 다.패키지 에서 데이터 베 이 스 를 조작 하고 FMDatabase 관리 에 직접 참여 하지 않 습 니 다.
FMDatabaseQueue * queue = [FMDatabaseQueue databaseQueueWithPath:database_path];
dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL);
dispatch_queue_t q2 = dispatch_queue_create("queue2", NULL);
dispatch_async(q1, ^{
for (int i = 0; i < 50; ++i) {
[queue inDatabase:^(FMDatabase *db2) {
NSString *insertSql1= [NSString stringWithFormat:
@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",
TABLENAME, NAME, AGE, ADDRESS];
NSString * name = [NSString stringWithFormat:@"jack %d", i];
NSString * age = [NSString stringWithFormat:@"%d", 10+i];
BOOL res = [db2 executeUpdate:insertSql1, name, age,@" "];
if (!res) {
NSLog(@"error to inster data: %@", name);
} else {
NSLog(@"succ to inster data: %@", name);
}
}];
}
});
dispatch_async(q2, ^{
for (int i = 0; i < 50; ++i) {
[queue inDatabase:^(FMDatabase *db2) {
NSString *insertSql2= [NSString stringWithFormat:
@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",
TABLENAME, NAME, AGE, ADDRESS];
NSString * name = [NSString stringWithFormat:@"lilei %d", i];
NSString * age = [NSString stringWithFormat:@"%d", 10+i];
BOOL res = [db2 executeUpdate:insertSql2, name, age,@" "];
if (!res) {
NSLog(@"error to inster data: %@", name);
} else {
NSLog(@"succ to inster data: %@", name);
}
}];
}
});
원본 다운로드:DEMO이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.