你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS中的SQLLite

iOS中的SQLLite

編輯:IOS開發綜合

iPhone中支持通過sqlite3來訪問iPhone本地的數據庫。

具體使用方法如下

1:添加開發包libsqlite3.0.dylib

首先是設置項目文件,在項目中添加iPhone版的sqlite3的數據庫的開發包,在項目下的Frameworks點擊右鍵,然後選擇libsqlite3.0.dylib文件。

 

2,代碼中的操作:

那麼接下來是代碼了。

1 首先獲取iPhone上sqlite3的數據庫文件的地址

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@database_name];

2 打開iPhone上的sqlite3的數據庫文件

sqlite3 *database;
sqlite3_open([path UTF8String], &database);

3 准備sql文---sql語句

sqlite3_stmt *stmt;
const char *sql = SELECT * FROM table_name WHERE pk=? and name=?;
sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);

4 邦定參數

// 邦定第一個int參數
sqlite3_bind_int(stmt, 1, 1);
// 邦定第二個字符串參數
sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);

5 執行sql文

sqlite3_step(stmt);

6 釋放sql文資源

sqlite3_finalize(stmt);

7 關閉iPhone上的sqlite3的數據庫

sqlite3_close(database);


http://hi.baidu.com/clickto/blog/item/0c6904f787c34125720eec87.html

以下演示一下使用sqlite的步驟,先創建一個數據庫,然後查詢其中的內容。2個重要結構體和5個主要函數:

sqlite3 *pdb, 數據庫句柄,跟文件句柄FILE很類似

sqlite3_stmt *stmt, 這個相當於ODBC的Command對象,用於保存編譯好的SQL語句



sqlite3_open(), 打開數據庫

sqlite3_exec(), 執行非查詢的sql語句

sqlite3_prepare(), 准備sql語句,執行select語句或者要使用parameter bind時,用這個函數(封裝了sqlite3_exec).

Sqlite3_step(), 在調用sqlite3_prepare後,使用這個函數在記錄集中移動。

Sqlite3_close(), 關閉數據庫文件



還有一系列的函數,用於從記錄集字段中獲取數據,如

sqlite3_column_text(), 取text類型的數據。

sqlite3_column_blob(),取blob類型的數據

sqlite3_column_int(), 取int類型的數據

PreparedStatement方式處理SQL請求的過程
特點:可以綁定參數,生成過程。執行的時候像是ADO一樣,每次返回一行結果。

1. 首先建立statement對象:
int sqlite3_prepare(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nBytes, /* Length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);

2. 綁定過程中的參數(如果有沒有確定的參數)
int sqlite3_bind_xxxx(sqlite3_stmt*, int, ...);
第二個int類型參數-表示參數的在SQL中的序號(從1開始)。
第三個參數為要綁定參數的值。
對於blob和text數值的額外參數:
第四參數是字符串(Unicode 8or16)的長度,不包括結束''。
第五個參數,類型為void(*)(void*),表示SQLite處理結束後用於清理參數字符串的函數。
沒有進行綁定的未知參數將被認為是NULL。

3. 執行過程
int sqlite3_step(sqlite3_stmt*);
可能的返回值:
*SQLITE_BUSY: 數據庫被鎖定,需要等待再次嘗試直到成功。
*SQLITE_DONE: 成功執行過程(需要再次執行一遍以恢復數據庫狀態)
*SQLITE_ROW: 返回一行結果(使用sqlite3_column_xxx(sqlite3_stmt*,, int iCol)得到每一列的結果。
再次調用將返回下一行的結果。
*SQLITE_ERROR: 運行錯誤,過程無法再次調用(錯誤內容參考sqlite3_errmsg函數返回值)
*SQLITE_MISUSE: 錯誤的使用了本函數(一般是過程沒有正確的初始化)

4. 結束的時候清理statement對象
int sqlite3_finalize(sqlite3_stmt *pStmt);
應該在關閉數據庫之前清理過程中占用的資源。

5. 重置過程的執行
int sqlite3_reset(sqlite3_stmt *pStmt);
過程將回到沒有執行之前的狀態,綁定的參數不會變化。

 

獲取文件的路徑

 

- (NSString *)getDataBasePath
{
    NSString* path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString* filePath = [path stringByAppendingPathComponent:@database.db];
    
//   NSString* filePath  = [NSHomeDirectory() stringByAppendingPathComponent:@Document/database.db];
    
    return filePath;
}

 

打開數據庫

- (void)openDatabase
{
    //1、獲取文件路徑
    NSString* filePath = [self getDataBasePath];
    //2、oc字符串--->c字符串
    const char * filename = [filePath UTF8String];
    
    //3、打開數據庫  :如果數據庫文件存在直接打開,不存在,系統會在該路徑下創建同名文件.
    
    //1‘  數據庫文件名 c字符串
    //2‘  數據庫對象 sqlite3 **ppDb
    int rc = sqlite3_open(filename,&_database);
    //SQLITE_OK  操作成功
    
    //數據庫打開失敗
    if (rc != SQLITE_OK) {
        //關閉數據庫:
        sqlite3_close(_database);
        
        //插入斷言:如果條件表達式的值為NO,程序崩潰,會輸出參數2的值
        //1'<#condition#>條件判斷
        //2'desc  程序崩潰後輸出的字符串
        NSAssert(NO, @數據庫打開失敗,請檢查文件路徑);
        
    }else{
        NSLog(@數據庫打開成功);
    }
    
    
}

數據表創建

- (IBAction)createTable:(id)sender
{
    //1、打開數據庫
    [self openDatabase];
    
    //2、創建表的SQL語句: ContactTable
    NSString* createSql = @CREATE TABLE ContactTable (name TEXT,phone TEXT) ;
    char* errmsg = nil;
    
    //3、執行創建表的sql語句:
    //1' 數據庫對象
    //2' SQL語句 -C字符串   將OC字符串轉換成C字符串
    //3' C語言的回調函數:類似於代理方法,NULL
    //4' 回調函數中的第一個參數: NULL
    //5' 執行的錯誤信息
    int rc = sqlite3_exec(_database, [createSql UTF8String], NULL, NULL, &errmsg);
    //SQLITE_OK 執行成功
    //表的創建失敗
    if (rc != SQLITE_OK) {
        NSLog(@數據表創建失敗);
    }else{
        NSLog(@數據庫表創建成功);
    }
    //使用完關閉數據庫
    sqlite3_close(_database);
    
}

插入數據

- (IBAction)insertData:(id)sender
{
    //1.打開數據庫
    [self openDatabase];
    
    //2.SQL語句:?代表字段內容的占位符,有幾個字段需要幾個?
    NSString* insertSql = @INSERT INTO ContactTable VALUES(?,?);
    
    //准備一個緩沖區   結構體
    sqlite3_stmt * stmt = nil;
    
    //3、准備插入數據:將sql語句轉化成字節碼,並不執行語句
    //1' 數據庫對象
    //2' sql語句c字符串
    //3' sql語句的長度:strlen函數獲取strlen([insertSql UTF8String],此處一般填寫-1,代表從sql語句的第一個字符 讀取到 第一個終止符;讀取完整地sql語句
    //4' 語句的緩沖區
    //5' pzTail:如果參數3指定的不是完整地sql語句,此參數會保留剩余的部分;NULL
    int rc = sqlite3_prepare_v2(_database, [insertSql UTF8String], -1, &stmt, NULL);
    //如果數據准備完成 :SQLITE_OK
    if (rc == SQLITE_OK) {
        //4、將內容綁定到緩存區:
        
        //1' 指定的緩存區
        //2' 字段索引:從1開始;默認每一條記錄都會添加一個ROWID
        //3' 字段的值:c字符串
        //4' 字符串的長度
        //5' 函數指針:NULL
        NSString* name = @zhangsan;
        sqlite3_bind_text(stmt, 1, [name UTF8String], strlen([name UTF8String]),NULL);
        NSString* phone = @電話號碼;
        sqlite3_bind_text(stmt, 2, [phone UTF8String], strlen([phone UTF8String]), NULL);
        //5、執行sql語句,如果綁定過程發生錯誤,會將緩存區的內容置空
        int rc = sqlite3_step(stmt);
        //執行插入操作是否成功
        //SQLITE_DONE:如果執行成功,表示插入一條記錄執行完畢,沒有下一條記錄
        //SQLITE_ROW:執行一條記錄完成,還有下一條記錄
        if (rc == SQLITE_DONE) {
            NSLog(@插入數據成功);
        }else{
            NSLog(@插入數據失敗____%s,sqlite3_errmsg(_database));
        }
       
       //6、釋放緩存區  :  句柄
        sqlite3_finalize(stmt);
    }
    
    //7、關閉數據庫
    sqlite3_close(_database);
    
}

刪除數據

- (IBAction)deleteData:(id)sender
{
    //1、打開數據庫
    [self openDatabase];
    
    //2、sql語句
    NSString* deleteSql = @DELETE FROM ContactTable WHERE name = 'zhangsan';
    //3、緩存區
    sqlite3_stmt* stmt = NULL;
    //4、准備sql語句
    int rc = sqlite3_prepare_v2(_database, [deleteSql UTF8String], strlen([deleteSql UTF8String]), &stmt, NULL);
    //5、准備完成,
    if (rc == SQLITE_OK) {
        //6、執行sql語句
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@數據刪除完成);
        }
        //7、釋放緩存區
        sqlite3_finalize(stmt);
    }
    //8、關閉數據庫
    sqlite3_close(_database);

}

修改數據

- (IBAction)upDateData:(id)sender
{
    //1.打開數據庫
    [self openDatabase];
    //2.SQL語句
//    NSString* updateSql = @UPDATE ContactTable SET phone = '18909091234' WHERE name = 'zhangsan';
    
    NSString* updateSql = @UPDATE ContactTable SET phone = '18909091234' WHERE ROWID = 1;
    
    //3.緩存區
    sqlite3_stmt* stmt = NULL;
    //4.准備sql
    int rc = sqlite3_prepare_v2(_database, [updateSql UTF8String], -1, &stmt, NULL);
    //5.准備完成
    if (rc == SQLITE_OK) {
        //6.執行sql
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@數據更新成功);
        }else{
            NSLog(@數據更新失敗);
        }
        //7.釋放緩存區
        sqlite3_finalize(stmt);
    }
    //8.關閉數據庫
    sqlite3_close(_database);
}

查詢

- (IBAction)queryData:(id)sender
{
    //裝取出的每一條記錄
    NSMutableArray* mArray = [NSMutableArray array];
    
    //1.打開數據庫
    [self openDatabase];
    
    //2.sql語句
    NSString* querySql = @SELECT * FROM ContactTable;
    //3.准備一個緩存區
    sqlite3_stmt* stmt = NULL;
    
    //4.准備讀取數據:
    int rc = sqlite3_prepare_v2(_database, [querySql UTF8String], -1, &stmt, NULL);
    //5.准備完成
    if (rc == SQLITE_OK) {
        
        //6.執行sql:如果有多條數據,或者不知道數據庫中有多少行數據,使用while循環執行
        //如果執行完畢,返回SQLITE_DONE,不再走while語句;如果還有下一條數據,返回SQLITE_ROW,繼續進入while循環
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //7.從緩存區取數據:
            //1' 緩存區
            //2' 字段索引: 從0開始
            char* name = (char *)sqlite3_column_text(stmt, 0);
            char * phone =(char *)sqlite3_column_text(stmt, 1);
            
            //將C字符串--->OC字符串
            NSString* nameStr =  [[NSString alloc] initWithUTF8String:name];
//            [NSString stringWithUTF8String:name];
            NSString* phoneStr = [[NSString alloc] initWithUTF8String:phone];
            
            //每條記錄都有電話和姓名:放在數組中,一個數據代表一條記錄
            [mArray addObject:nameStr];
            [mArray addObject:phoneStr];
            
        }
        //釋放緩存區:寫在while循環外
        sqlite3_finalize(stmt);
    }
    
    for (id object in mArray) {
        NSLog(@取出的數據為____%@,object);
    }
    
    //關閉數據庫
    sqlite3_close(_database);
    
}


 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved