iOS App 프로젝트 에 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 를 가 져 오 는 그림 을 첨부 합 니 다:
그 플러스 를 누 르 세 요.그리고 sqlite 3 을 검색 하고 sqlite 3.0.dylib 를 선택 한 다음 Add 를 누 르 십시오.그리고 너 는 공사 중 에 이 창고 가 들 어 오 는 것 을 보 았 다.
그리고 호출 할 곳 에서 헤더 파일 가 져 오기:
SQLite 데이터 형식
데이터 베 이 스 를 사용 하려 면 먼저 그의 데이터 형식 을 알 아야 하지 않 겠 습 니까?sqlite 데이터 형식 및 간단 함:
NULL.빈 값INTEGER.정형REAL.부동 소수점 형TEXT.텍스트 형식
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 의 핸들 을 우 리 는 만 들 었 습 니 다.우 리 는 앞으로 데이터 베 이 스 를 대상 으로 하 는 작업 을 모두 떠 날 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.