IOS---SQLite3使用

IOS---SQLite3使用


iPhone中支持通過sqlite3來訪問本地數據庫,SQLiteMySQL精簡版,但無需服務器就能運行,它有兩個限制:一是必須手動去創建,二是沒有面向對象的接口。它的具體用法如下:

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的數據表,其包含兩個字段userNamepassWord。代碼如下所示:

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_v2sqlite3_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語句最大的長度,如果此參數爲負數,則根據第二個參數中的第一個終結符爲準作爲一條完整的語句。如果爲非負數,則以第二個參數的第一個終結符(00u0000)或者指定的數字爲準作爲一條完整語句。第四個參數則是調用函數後返回的一個結構體,此結構體包含了相關語句的信息。關於第五個參數是用於指向前一條語句結束位置,一旦指定此參數,則參數指向位置的左邊語句將不進行編譯解析。

判斷表是否存在:

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,信息成功保存到數據庫中。

斷點執行,在此處可以看到輸入的信息:

   

文檔部分內容參考iPhone實戰操作SQLite地址:http://m.oschina.net/blog/65294


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章