FMDB 소스 제품군 (1)

5461 단어
FMDB에는 FMDatabase, FMDatabaseQueue, FMResultSet 등 세 가지 중량급 클래스가 있다.
  • FMDatabase는 sqlite3 데이터베이스 대상을 나타내는 데 사용된다.
  • FMDatabaseQueue는 스레드가 안전한 다중 스레드 데이터베이스 작업을 수행하는 데 사용됩니다.
  • FMResultSet 데이터베이스 대상은 sql문장에 따라 조작한 결과 집합 대상입니다.

  • 필자는 FMDB 원본에 대한 탐구는 먼저 이 세 가지 유형에서 착안했다. FMDatabaseQueue는 FMDatabase를 인용했고 FMDatabase는 FMResultSet을 인용했다.그래서 필자는 FMResultSet->FMDatabase->FMDatabaseQueue와 같은 순서를 통해 이 세 가지를 해석하기로 결정했다.
    FMDB에서 사용되는 매크로
    원본 코드를 해석하기 전에 FMDB에서 자주 사용하는 매크로를 살펴보자.
  • NS_ASSUME_NONNULL_BEGIN&NS_ASSUME_NONNULL_END는 코드에서 두 매크로 사이에 포함된 속성과 메서드에 nonnull 태그가 붙습니다.이 속성이나 방법이 이 제약을 받지 않으려면 대응하는 속성에nullable를 넣으면 이 두 매크로가 정의한 문장을 볼 수 있습니다
  • #ifndef NS_ASSUME_NONNULL_BEGIN
    #define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
    #endif
    #ifndef NS_ASSUME_NONNULL_END
    #define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")
    #endif
    

    _Pragma가 익숙해 보이지 않아요? 코드에 자주 써요.
    #pragma mark -       
    

    이것은 C++의 잡주 명령입니다. 이 점에 관해서는 여기를 보십시오.이것은 우리가 이렇게 쓰는 것도 효과가 있다는 것을 의미한다
    #pragma clang assume_nonnull begin
    #pragma clang assume_nonnull end
    
  • FMDB_SQLITE_STANDALONE 이 매크로는 FMDB의podspec에서 정의한 것이다
  • s.subspec 'standalone' do |ss|
        ss.xcconfig = { 'OTHER_CFLAGS' => '$(inherited) -DFMDB_SQLITE_STANDALONE' }
        ss.dependency 'sqlite3'
        ss.source_files = 'src/fmdb/FM*.{h,m}'
        ss.exclude_files = 'src/fmdb.m'
      end
    

    현재 FMDB에 설정된 기본 하위 폴더는'standard'입니다. standalone이나standalone-fts가 아닙니다.그래서 이 매크로는 공사에서 모두 NO로 돌아간다.
  • OS_OBJECT_USE_OBJC 이 매크로는 FMDB에서
  • #if OS_OBJECT_USE_OBJC
            #define FMDBDispatchQueueRelease(__v)
        #else
            #define FMDBDispatchQueueRelease(__v) (dispatch_release(__v));
        #endif
    

    OS_OBJECT_USE_OBJC는 과거 iOS 6.0 이하 버전의 GCD에 대해 ARC를 갖추지 못해서 만들어진 것이다.그래서 OS로...OBJECT_USE_OBJC가 0으로 되돌아갈 때 GCD는 dispatch 를 사용해야 합니다.메모리를 풀기 위해 release () 를 사용하십시오.
  • NS_RETURNS_NOT_RETAINED라는 매크로는 반환 값을 표시하는 방법에 사용되며, NS 라는 형제도 있다RETURNS_RETAINED.FMDB에 이 매크로를 표시하는 방법은 두 가지뿐이며, 모두 주석에 Warning을 썼다.
  • - (NSData * _Nullable)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED;
    
    - (NSData * _Nullable)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED;
    

    NS_RETURNS_NOT_RETAINED는 이 방법이 되돌아오는 대상이release가 필요하지 않고 NSRETURNS_RETAINED는 메서드가 반환하는 객체가 release가 필요함을 나타냅니다.
    마지막으로has_feature 이 방법은 Clang에서 이렇게 설명한HasFeature-Return true if we recognize and implement the feature specified by the identifier as a standard language feature.즉, 만약에 우리가 표지부호가 지정한 기능을 표준 언어 기능으로 식별하고 실현한다면true(Google 번역,doge)로 되돌아간다.Clang에서 아주 많은 키워드를 정의했습니다. 관심 있는 분들은 PPMacro Expansion을 보십시오.cpp, 1094줄부터 시작합니다.
    FMDB에 사용된 Sqlite3 오류 코드를 다시 붙여주세요.
    #define SQLITE_OK           0   /*    | Successful result */
    /*       */
    #define SQLITE_ERROR        1   /* SQL           | SQL error or missing database */
    #define SQLITE_INTERNAL     2   /* SQLite        | Internal logic error in SQLite */
    #define SQLITE_PERM         3   /*      | Access permission denied */
    #define SQLITE_ABORT        4   /*            | Callback routine requested an abort */
    #define SQLITE_BUSY         5   /*          | The database file is locked */
    #define SQLITE_LOCKED       6   /*             | A table in the database is locked */
    #define SQLITE_NOMEM        7   /*    malloc()        | A malloc() failed */
    #define SQLITE_READONLY     8   /*             | Attempt to write a readonly database */
    #define SQLITE_INTERRUPT    9   /*     sqlite3_interupt()      | Operation terminated by sqlite3_interrupt() */
    #define SQLITE_IOERR       10   /*        I/O    | Some kind of disk I/O error occurred */
    #define SQLITE_CORRUPT     11   /*            | The database disk image is malformed */
    #define SQLITE_NOTFOUND    12   /* sqlite3_file_control()          | Unknown opcode in sqlite3_file_control() */
    #define SQLITE_FULL        13   /*              | Insertion failed because database is full */
    #define SQLITE_CANTOPEN    14   /*           | Unable to open the database file */
    #define SQLITE_PROTOCOL    15   /*           | Database lock protocol error */
    #define SQLITE_EMPTY       16   /*       | Database is empty */
    #define SQLITE_SCHEMA      17   /*          | The database schema changed */
    #define SQLITE_TOOBIG      18   /*                 | String or BLOB exceeds size limit */
    #define SQLITE_CONSTRAINT  19   /*           | Abort due to constraint violation */
    #define SQLITE_MISMATCH    20   /*         | Data type mismatch */
    #define SQLITE_MISUSE      21   /*         | Library used incorrectly */
    #define SQLITE_NOLFS       22   /*               | Uses OS features not supported on host */
    #define SQLITE_AUTH        23   /*      | Authorization denied */
    #define SQLITE_FORMAT      24   /*           | Auxiliary database format error */
    #define SQLITE_RANGE       25   /*    sqlite3_bind()           | 2nd parameter to sqlite3_bind out of range */
    #define SQLITE_NOTADB      26   /*                 | File opened that is not a database file */
    #define SQLITE_ROW         100  /* sqlite3_step()           | sqlite3_step() has another row ready */
    #define SQLITE_DONE        101  /* sqlite3_step()        | sqlite3_step() has finished executing */
    

    다음 편에서는 FMResultSet의 세계로 들어가 끝까지 살펴보겠습니다.

    좋은 웹페이지 즐겨찾기