iOS App 프로젝트 에 SQLite 데이터 베 이 스 를 도입 하 는 튜 토리 얼

10817 단어 iOSSQLite
SQLite 도입
sqlite 는 순수 C 로 이 루어 졌 기 때문에 크로스 플랫폼 이기 로 정 해 져 있 습 니 다.안 드 로 이 드 와 IOS 에서 모두 사용 할 수 있 고 통용 되 는 코드 를 쓸 수 있어 서 이식 하기에 편리 합 니 다.물론 안 드 로 이 드 와 IOS 에 포 장 된 sqlite 가 개발 자 에 게 사용 되 지만 하 나 는 이식 이 불편 하고 다른 하 나 는 포 장 된 효율 이 어떤 지 모 르 기 때문에 원생 태 의 가장 건강 합 니 다.마지막 으로 중요 한 이 유 는 원생 의 사용 도 상당히 간단 하 다 는 것 이다.나 는 다음 강좌 에서 당신 을 위해 일일이 설명 할 것 입 니 다.
우선 가장 중요 한 것 은 프로젝트 에서 sqlite 를 가 져 오 는 것 입 니 다.애플 의 SDK 가 포함 되 어 있 기 때문에 libsqlite 3.0.dylib 라 는 framework 를 가 져 오 면 됩 니 다.그리고 해당 헤더 파일 포함:\#import"sqlite 3.h"    。
IOS 프로젝트 의 도입 이 끝 났 으 니 정상적으로 사용 할 수 있 습 니 다.
다른 프로젝트 에서,예 를 들 어 android,끼 워 넣 는 linux 에서,우 리 는 두 개의 파일 을 추가 해 야 합 니 다.http://sqlite.org/download.html 해당 파일 을 다운로드 하 십시오.어떤 플랫폼 을 사용 하 시 면 다음 파일 에 대응 합 니까?하지만 저 는 보통 다음 에 sqlite-amalgamion-3071000.zip 이 라 고 합 니 다.  이 파일 에는 sqlite 3.c 와 sqlite 3.h 가 포함 되 어 있 습 니 다.나 는 직접 이 두 파일 을 나의 공사 에 끌 고 가서 사용 해 야 할 곳 에 h 파일 을 포함 시 키 면 된다.이렇게 하면 컴 파일 된 라 이브 러 리 를 호출 하 는 것 보다 좋 은 점 은 제 가 더욱 편리 하 게 디 버 깅 을 할 수 있다 는 것 입 니 다.저도 그의 기능 에 대해 수정 을 할 수 있 습 니 다.예 를 들 어 저 는 안에 자신의 암호 화 방식 을 추가 할 수 있 거나 제 가 몇 개의 반전 함 수 를 추가 하여 상부 와 의 상호작용 을 편리 하 게 할 수 있 습 니 다.또는 우리 가 필요 로 하지 않 는 기능 을 삭제 하고 코드 의 번 거 로 움 을 줄인다.
다음 설명 에서 저 는 순수 C 로 설명 하 겠 습 니 다.비록 저 는 애플 의 xcode 환경 에서 코드 를 쓸 것 이지 만 라 이브 러 리 의 인용 방식 이 다른 것 을 제외 하고 다른 것 은 모두 똑 같 습 니 다.저 는 플랫폼 과 관련 된 것 을 최대한 피 하 겠 습 니 다.물론 가끔 은 UI 가 있 는 Demo 를 쓸 수 있 습 니 다.이 럴 때 플랫폼 과 접촉 하 는 것 을 피 할 수 없습니다.그러나 이 튜 토리 얼 의 관건 은 바 텀 원 리 를 이해 하고 sqlite 의 API 호출 을 배 워 서 자신의 수요 에 따라 포장 하고 인 터 페 이 스 를 제공 하 는 것 입 니 다.
마지막 으로 xcode 에서 sqlite 를 가 져 오 는 그림 을 첨부 합 니 다:
20166291310645.gif (1024×250)
그 플러스 를 누 르 세 요.그리고 sqlite 3 을 검색 하고 sqlite 3.0.dylib 를 선택 한 다음 Add 를 누 르 십시오.그리고 너 는 공사 중 에 이 창고 가 들 어 오 는 것 을 보 았 다.
20166291339013.gif (390×454) 20166291357702.gif (265×228)
그리고 호출 할 곳 에서 헤더 파일 가 져 오기:
20166291423813.gif (251×42)
SQLite 데이터 형식
데이터 베 이 스 를 사용 하려 면 먼저 그의 데이터 형식 을 알 아야 하지 않 겠 습 니까?sqlite 데이터 형식 및 간단 함:
NULL.빈 값INTEGER.정형REAL.부동 소수점 형TEXT.텍스트 형식
  • BLOB.바 이 너 리 형식 으로 그림 과 같은 파일 을 저장 합 니 다
  • 이상 은 sqlite 의 저장 형식 입 니 다.물론 모든 유형 은 데이터 길이 에 따라 하위 형식 이 다 릅 니 다.이것 은 지금 말 하지 않 는 다.왜냐하면 너 는 상술 한 이런 큰 유형 을 직접 사용 할 수 있 기 때문이다.몇 가지 유형 이 있 는 지 알 았 으 면 좋 겠 어.앞으로 실제 운용 에서 천천히 익숙해 지면 좋 겠 어 요.
    sqlite 는 데이터 형식 을 미리 설명 하 라 고 강요 하지 않 았 습 니 다.실제 저장 과정 에서 실제 유형 에 따라 자동 으로 전환 되 지만 효율 을 높이 기 위해 non-datatype 을 권장 하지 않 습 니 다.
    아래 에 표를 만 드 는 코드 를 첨부 합 니 다.주로 데이터 형식의 실제 운용 을 체험 하 게 합 니 다.
    
    CREATE TABLE student( 
      name TEXT,  //   
      no INTEGER, //   
      totalScore REAL, //   
      photo BLOB   //   
    ); 
    
    핸들 정의
    데이터 베 이 스 를 조작 하려 면 이 데이터 뱅 크 의 핸들 이 있어 야 한다.사실 너 는 본래 이 단어 가 무엇 인지 신경 쓸 필요 가 없 었 다.너 는 그 가 어떤 물건 인지 알 기만 하면 된다.신발 을 왜 신발 이 라 고 부 르 는 지 곰 곰 이 생각해 봐 도 이해 가 안 되 지만 그의 기능 을 잘 알 면 괜 찮 지 않 습 니까?
    핸들 은 많은 곳 에서 우리 가 본 적 이 있 습 니 다.가장 흔히 볼 수 있 는 것 은 파일 의 핸들 입 니 다.우 리 는 파일 을 조작 하려 면 파일 의 핸들 을 가 져 야 합 니 다.문형 은 무엇 입 니까?사실은 매우 간단 하 다.문형 은 동쪽 에서 묘사 한 것 이다.그 는 하나의 구조 체 로 정의 되 었 다.이 구조 체 는 묘사 하고 자 하 는 동쪽 에서 구체 적 인 정 보 를 포함 할 수 있다.예 를 들 어 위치,크기,유형 등 이다.우 리 는 이 설명 정보 가 있 으 면 이 물건 을 찾 아서 그것 을 조종 할 수 있다.
    한 마디 로 문형 은 물체 의 묘사 구조 체 이다.
    sqlite 의 핸들 이 어떻게 정의 되 는 지 봅 시다.
    
    struct sqlite3 { 
     sqlite3_vfs *pVfs;      /* OS Interface */ 
     int nDb;           /* Number of backends currently in use */ 
     Db *aDb;           /* All backends */ 
     int flags;          /* Miscellaneous flags. See below */ 
     unsigned int openFlags;    /* Flags passed to sqlite3_vfs.xOpen() */ 
     int errCode;         /* Most recent error code (SQLITE_*) */ 
     int errMask;         /* & result codes with this before returning */ 
     u8 autoCommit;        /* The auto-commit flag. */ 
     u8 temp_store;        /* 1: file 2: memory 0: default */ 
     u8 mallocFailed;       /* True if we have seen a malloc failure */ 
     u8 dfltLockMode;       /* Default locking-mode for attached dbs */ 
     signed char nextAutovac;   /* Autovac setting after VACUUM if >=0 */ 
     u8 suppressErr;        /* Do not issue error messages if true */ 
     u8 vtabOnConflict;      /* Value to return for s3_vtab_on_conflict() */ 
     int nextPagesize;       /* Pagesize after VACUUM if >0 */ 
     int nTable;          /* Number of tables in the database */ 
     CollSeq *pDfltColl;      /* The default collating sequence (BINARY) */ 
     i64 lastRowid;        /* ROWID of most recent insert (see above) */ 
     u32 magic;          /* Magic number for detect library misuse */ 
     int nChange;         /* Value returned by sqlite3_changes() */ 
     int nTotalChange;       /* Value returned by sqlite3_total_changes() */ 
     sqlite3_mutex *mutex;     /* Connection mutex */ 
     int aLimit[SQLITE_N_LIMIT];  /* Limits */ 
     struct sqlite3InitInfo {   /* Information used during initialization */ 
      int iDb;          /* When back is being initialized */ 
      int newTnum;        /* Rootpage of table being initialized */ 
      u8 busy;          /* TRUE if currently initializing */ 
      u8 orphanTrigger;      /* Last statement is orphaned TEMP trigger */ 
     } init; 
     int nExtension;        /* Number of loaded extensions */ 
     void **aExtension;      /* Array of shared library handles */ 
     struct Vdbe *pVdbe;      /* List of active virtual machines */ 
     int activeVdbeCnt;      /* Number of VDBEs currently executing */ 
     int writeVdbeCnt;       /* Number of active VDBEs that are writing */ 
     int vdbeExecCnt;       /* Number of nested calls to VdbeExec() */ 
     void (*xTrace)(void*,const char*);    /* Trace function */ 
     void *pTraceArg;             /* Argument to the trace function */ 
     void (*xProfile)(void*,const char*,u64); /* Profiling function */ 
     void *pProfileArg;            /* Argument to profile function */ 
     void *pCommitArg;         /* Argument to xCommitCallback() */   
     int (*xCommitCallback)(void*);  /* Invoked at every commit. */ 
     void *pRollbackArg;        /* Argument to xRollbackCallback() */   
     void (*xRollbackCallback)(void*); /* Invoked at every commit. */ 
     void *pUpdateArg; 
     void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); 
    #ifndef SQLITE_OMIT_WAL 
     int (*xWalCallback)(void *, sqlite3 *, const char *, int); 
     void *pWalArg; 
    #endif 
     void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); 
     void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); 
     void *pCollNeededArg; 
     sqlite3_value *pErr;     /* Most recent error message */ 
     char *zErrMsg;        /* Most recent error message (UTF-8 encoded) */ 
     char *zErrMsg16;       /* Most recent error message (UTF-16 encoded) */ 
     union { 
      volatile int isInterrupted; /* True if sqlite3_interrupt has been called */ 
      double notUsed1;      /* Spacer */ 
     } u1; 
     Lookaside lookaside;     /* Lookaside malloc configuration */ 
    #ifndef SQLITE_OMIT_AUTHORIZATION 
     int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); 
                    /* Access authorization function */ 
     void *pAuthArg;        /* 1st argument to the access auth function */ 
    #endif 
    #ifndef SQLITE_OMIT_PROGRESS_CALLBACK 
     int (*xProgress)(void *);   /* The progress callback */ 
     void *pProgressArg;      /* Argument to the progress callback */ 
     int nProgressOps;       /* Number of opcodes for progress callback */ 
    #endif 
    #ifndef SQLITE_OMIT_VIRTUALTABLE 
     Hash aModule;         /* populated by sqlite3_create_module() */ 
     VtabCtx *pVtabCtx;      /* Context for active vtab connect/create */ 
     VTable **aVTrans;       /* Virtual tables with open transactions */ 
     int nVTrans;         /* Allocated size of aVTrans */ 
     VTable *pDisconnect;  /* Disconnect these in next sqlite3_prepare() */ 
    #endif 
     FuncDefHash aFunc;      /* Hash table of connection functions */ 
     Hash aCollSeq;        /* All collating sequences */ 
     BusyHandler busyHandler;   /* Busy callback */ 
     int busyTimeout;       /* Busy handler timeout, in msec */ 
     Db aDbStatic[2];       /* Static space for the 2 default backends */ 
     Savepoint *pSavepoint;    /* List of active savepoints */ 
     int nSavepoint;        /* Number of non-transaction savepoints */ 
     int nStatement;        /* Number of nested statement-transactions */ 
     u8 isTransactionSavepoint;  /* True if the outermost savepoint is a TS */ 
     i64 nDeferredCons;      /* Net deferred constraints this transaction. */ 
     int *pnBytesFreed;      /* If not NULL, increment this in DbFree() */ 
     
    #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY 
     /* The following variables are all protected by the STATIC_MASTER 
     ** mutex, not by sqlite3.mutex. They are used by code in notify.c. 
     ** 
     ** When X.pUnlockConnection==Y, that means that X is waiting for Y to 
     ** unlock so that it can proceed. 
     ** 
     ** When X.pBlockingConnection==Y, that means that something that X tried 
     ** tried to do recently failed with an SQLITE_LOCKED error due to locks 
     ** held by Y. 
     */ 
     sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ 
     sqlite3 *pUnlockConnection;      /* Connection to watch for unlock */ 
     void *pUnlockArg;           /* Argument to xUnlockNotify */ 
     void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ 
     sqlite3 *pNextBlocked;    /* Next in list of all blocked connections */ 
    #endif 
    }; 
    
    typedef struct sqlite3 sqlite3;// 
    
    
    놀 라 셨 나 요?괜 찮 습 니 다.이 코드 는 원래 제 가 붙 여서 겁 을 주 었 습 니 다.저도 이 코드 를 진지 하 게 연구 한 적 이 없고 연구 하고 싶 지 않 습 니 다.언젠가 누군가가 비 싼 값 을 내 서 저 에 게 연 구 를 청 하지 않 으 면 저 는 지금 어떻게 사용 해 야 할 지 만 알 고 있 습 니 다.
    이 sqlite 3 구조 체 는 우리 디스크 에 있 는 데이터베이스 파일 을 묘사 하 는 데 사 용 됩 니 다.이 설명자 가 있 으 면 우 리 는 이 데이터 베 이 스 를 각종 조작 할 수 있 습 니 다.작업 의 구체 적 인 내막 을 우 리 는 알 필요 가 없습니다.우 리 는 API 를 어떻게 호출 하 는 지 만 알 아야 합 니 다.물론 가끔 은 내부 상황 을 조금 알 아야 합 니 다.이것 은 나중에 만 나 서 다시 이야기 해 야 합 니 다.
    내 가 이렇게 길 면 무 서운 코드 를 크게 추가 하 는 것 은 단지 하나의 목적 일 뿐이다.문형 에 대해 두려움 을 가지 지 마라.
    자,우리 의 주 제 를 시작 합 니 다.sqlite 에서 데이터 베 이 스 를 조작 하려 면 먼저 핸들 을 만들어 야 합 니 다.그리고 뒤에 있 는 모든 데이터 베 이 스 를 조작 할 때 이 핸들 을 사용 합 니 다.
    
    sqlite3* pdb; 
    
    이렇게 간단 합 니 다.이러한 ssqlite 의 핸들 을 우 리 는 만 들 었 습 니 다.우 리 는 앞으로 데이터 베 이 스 를 대상 으로 하 는 작업 을 모두 떠 날 수 없습니다.

    좋은 웹페이지 즐겨찾기