IOS---SQLite3使用
iPhone中支持通過sqlite3來訪問本地數據庫,SQLite是MySQL精簡版,但無需服務器就能運行,它有兩個限制:一是必須手動去創建,二是沒有面向對象的接口。它的具體用法如下:
1.添加開發包libsqlite3.0.dylib:
在自己新建的項目下,選擇Bulid Phases à Link Binary With Libraries(4 items) à “+” à libsqlite3.0.dylib à Add ,添加成功。
之後在代碼中導入sqlite3.h頭文件
#import<sqlite3.h>
2.具體代碼操作:
2.1設置數據庫文件名
#define KFileName @”database”
2.2.獲取數據庫文件的地址
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,信息成功保存到數據庫中。
斷點執行,在此處可以看到輸入的信息: