IOS---SQLite3使用sql
iPhone中支持經過sqlite3來訪問本地數據庫,SQLite是MySQL精簡版,但無需服務器就能運行,它有兩個限制:一是必須手動去建立,二是沒有面向對象的接口。它的具體用法以下:數據庫
1.添加開發包libsqlite3.0.dylib:服務器
在本身新建的項目下,選擇Bulid Phases à Link Binary With Libraries(4 items) à 「+」 à libsqlite3.0.dylib à Add ,添加成功。ide
以後在代碼中導入sqlite3.h頭文件函數
#import<sqlite3.h>lua
2.具體代碼操做:spa
2.1設置數據庫文件名.net
#define KFileName @」database」指針
2.2.獲取數據庫文件的地址code
NSArray*path=NSSearchPathForDirectoriesInDomains(NSDocumentDirector,NSUserDomainMask,YES);
NSString *dataBaseFilePath=[path objectAtIndex:0];
NSString *dataBasePath=[dataBaseFilePath stringByAppendingPathCompoment: KFileName];
NSLog(@」dataBasePath==%@」,dataBasePath);
2.3.打開數據庫和關閉數據庫
導入庫和頭文件以後,接下來的操做就是打開一個數據庫。這時候須要調用sqlite3_open這個函數來對打開一個數據庫文件。此函數聲明以下:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
其中第一個參數就是數據庫所存放的路徑,若是路徑下沒有數據庫文件則系統會在此路徑下建立一個數據庫。至於第二個參數則是數據庫的句柄引用,但此函數調用成功後此句柄將會保存打開數據庫的句柄,此句柄在日後的數據庫操做中須要用到。所以,可以下方式調用:
NSString *dbPath=[NSString stringWithFormat:@」%@/Documents/demo.db」,NSHomeDirectory()];
sqlite3 *database;
if (sqlite3_open([path UTF8String], &database)==SQLITE_OK) {
NSLog(@「open database successfully!」);
}
既然有打開數據庫,那麼就確定有關閉數據庫的操做了,咱們要養成良好的習慣,當須要使用數據庫的時候就執行sqlite3_open來打開數據庫,等使用完數據庫後就調用sqlite3_close函數來對數據庫進行關閉。關於sqlite3_close函數聲明以下:
int sqlite3_close(sqlite3 *);
關閉時傳入數據庫句柄便可對數據庫進行關閉。調用方式以下:
if(sqlite3_close(database)==SQLITE_OK)
NSLog(@「close database successfully!」);
2.4.對數據庫操做
經常使用的有兩種方式能夠操做數據庫中的數據和調整結構。
第一種就是sqlite3_exec函數,這種方法通常使用在不返回數據集的狀況,也就是說少用於查詢類的操做。若是使用他來建立表結構、更新、插入或者刪除操做是一種直觀快捷的方法。先來看看此方法的聲明:
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
第一個參數就是打開數據庫,第二個參數就是SQL語句,第三個參數爲回調方法的函數指針,一旦指定此參數後,當執行語句爲查詢語句時則在枚舉記錄集時回對調此方法。第四個參數則爲回調的第一個參數引用。至於第五個參數就是若是方法執行後存在異常,那麼這個參數保存的就是錯誤的描述信息。
建立數據表:
數據表是能夠包含不一樣的數據字段,這些字段能夠指定不一樣的數據類型,存儲不一樣的數據。咱們建表時能夠根據須要進行建立。下面的代碼建立了一個叫作INFO的數據表,其包含兩個字段userName和passWord。代碼以下所示:
char *errorMsg;
constchar *createsql = "CREATE Table IF NOT EXISTS INFO (userNameVARCHAR(50) PRIMARY KEY ,passWord VARCHAR(50))";
int result=sqlite3_exec(database, createsql, NULL,NULL, &errorMsg);
NSLog(@"%d",result);
if (result!=SQLITE_OK)
{
sqlite3_close(database);
NSLog(@"create table failed");
returnNO;
}
else
{
NSLog(@"create table succeeded");
returnYES;
}
在建表以前判斷表是否存在,若未存在則建表。
第二種就是使用sqlite3_prepare_v2和sqlite3_step兩個函數搭配的進行操做。其中sqlite3_prepare_v2是一個將SQL語句編譯爲sqlite內部一個結構體(sqlite3_stmt).該結構體中包含了將要執行的的SQL語句的信息。而sqlite3_step則是讓轉化後的SQL進行下一步的操做。所以經過這兩個函數能夠很方便的獲取到數據庫中的數據。下面是這兩個函數的聲明:
int sqlite3_prepare_v2(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
第一個參數就是打開數據庫時的數據庫句柄對象。第二個就是SQL語句。第三個參數是用於指定SQL語句最大的長度,若是此參數爲負數,則根據第二個參數中的第一個終結符爲準做爲一條完整的語句。若是爲非負數,則以第二個參數的第一個終結符(00或u0000)或者指定的數字爲準做爲一條完整語句。第四個參數則是調用函數後返回的一個結構體,此結構體包含了相關語句的信息。關於第五個參數是用於指向前一條語句結束位置,一旦指定此參數,則參數指向位置的左邊語句將不進行編譯解析。
判斷表是否存在:
sqlite3_stmt*statement;
NSString*sqlIsExistTable=[NSStringstringWithFormat:@"selectcount(*) from DataBase where name='%@'",tableName];
if (sqlite3_prepare_v2(database,[sqlIsExistTable UTF8String],-1,&statement,NULL)!= SQLITE_OK)
{
isExist=NO;
}
int execIsExist=sqlite3_step(statement);
if (execIsExist==SQLITE_ROW)
{
int count = sqlite3_column_int(statement, 0);
if (count>0) {
isExist=YES;
NSLog(@"table isexists");
}
else {
isExist= NO;
NSLog(@"table don't exist,execIsExist = %d,count =%d",execIsExist,count);
}
}
在判斷表是否存在以前,要判斷數據庫是否打開。
2.5.數據插入操做
上面的例子建立了一個數據後,可使用insert語句將數據插入表中:代碼以下所示:
if ([selfcreateTable]==YES)
{
NSString *insertInfo=[NSStringstringWithFormat:@"Insert into INFO (userName,passWord) values('%@','%@')",userNameTextField,pwdTextField];
NSInteger i=[selfexecNoQuery:insertInfo];
if (i>0)
{
UIAlertView *alert=[[UIAlertViewalloc]initWithTitle:nilmessage:@"success to insert "delegate:selfcancelButtonTitle:@"cancel"otherButtonTitles: nil];
[alert show];
}
} return [NSStringstringWithFormat:@"%@ %@",userNameTextField,pwdTextField];
視圖以下:
輸入信息,點擊save後彈出UIAlert,信息成功保存到數據庫中。
斷點執行,在此處能夠看到輸入的信息: