iOS 학습 노트(16)―데이터베이스 조작 상세 설명(FMDB 사용)

7845 단어 iosfmdb
iOS 에서 원생 인 SQLite API 는 사용 에 상당히 불 친절 해 사용 시 불편 하 다.그 러 자 FMDB,Plausible Database,sqlitepersistentobjects 등 SQLite API 를 봉인 하 는 일련의 라 이브 러 리 가 나 왔 다.FMDB(https://github.com/ccgus/fmdb)는 간결 하고 사용 하기 쉬 운 패키지 라 이브 러 리 로 FMDB 의 사용 을 간단하게 소개 한다.
FMDB 에서 파일 을 다운로드 한 후 프로젝트 에서 다음 파일 을 가 져 오고 libsqlite3.dylib 의존 패 키 지 를 사용 해 야 합 니 다.

FMDB 는 ARC 와 비 ARC 프로젝트 를 동시에 호 환 하 며,프로젝트 설정 에 따라 해당 메모리 관리 코드 를 자동 으로 조정 합 니 다.
FMDB 상용 클래스:
  • FMDatabase:단일 한 SQLite 데이터베이스 로 SQL 문 구 를 실행 하 는 데 사 용 됩 니 다
  • FMResultSet:FMDatabase 결과 집합 을 조회 합 니 다.이것 은 Android 의 Cursor 와 유사 합 니 다
  • FMDatabaseQueue:여러 스 레 드 에서 조회 와 업 데 이 트 를 수행 할 때 이 종 류 를 사용 합 니 다
  • 데이터베이스 만 들 기:
    
    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
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기