數據庫(SQLITE3函數總結): sqlite3_open, sqlite3_exec, slite3_close,sqlite3_prepare_v2,sqlite3_column_text,


               Sqlite3 的確非常好用。小巧、速度快。近期研究它,有一些收獲,這里把我對 sqlite3 的研究列出來,以備忘記。

              導入SQLLite library並引入頭文件.

               libsqlite3.dylib本身是個鏈接,在這里它指向libsqlite3.0.dylib。也就是說在這里你加入libsqlite3.dylib和加入libsqlite3.0.dylib事實上是加入了同一個文件,沒有差別,那為什么要加入libsqlite3.0.dylib呢?原因在於libsqlite3.dylib是舊版的sqlite3動態庫。也就是說假設出現了新的動態庫(如:libsqlite3.1.dylib)那libsqlite3.dylib將指向這個新的動態庫(libsqlite3.1.dylib)所以建議還是要加入libsqlite3.0.dylib。

   (1) 重要數據結構

sqlite 里最經常使用到的是 sqlite3 * 類型。

從數據庫打開開始,sqlite就要為這個類型准備好內存。直到數據庫關閉,整個過程都須要用到這個類型。當數據庫打開時開始,這個類型的變量就代表了你要操作的數據庫。以下再具體介紹。


 (2) 打開數據庫

打開數據庫鏈接sqlite3_open使用方法

原型:

SQLITE_API int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
用這個函數打開數據庫操作。

須要傳入兩個參數,一是數據庫文件名稱,比方ZUOYOU1314Students.sqlite. 在iOS中通常是[fileUTF8String]

    NSString * file = [documentsPathstringByAppendingPathComponent:@"ZUOYOU1314Students.sqlite"];

二是 sqlite3 ** 參數即前面提到的重要數據結構。這個結構底層細節怎樣。你不要管它。函數返回值表示操作是否正確,假設是 SQLITE_OK 則表示操作正常。相關的返回值sqlite定義了一些宏。

具體這些宏的含義能夠參考 sqlite3.h 文件。里面有具體定義.

參考代碼例如以下:

//指向數據庫的指針
static sqlite3 * db = nil;

//打開數據庫
+ (sqlite3 *)open
{
    //推斷數據庫對象是否打開, 即db 是否有值
    if (db != nil) {
        //db有值, 直接使用,不須要再打開
        return db;
    }
    
#pragma ------第一次實現了拷貝 第二次須要推斷documents里面是否已經有數據庫文件
    //先找到documents文檔
    NSString * documentsPath = kDocuments;
    //在documents 里面 拼接一個目錄
    NSString * file = [documentsPath stringByAppendingPathComponent:@"Students.sqlite"];
    //從包里面取到 叫Students名字 后綴是sqlite的文件
    NSString * bundleFile = [[NSBundle mainBundle]pathForResource:@"Students" ofType:@"sqlite"];
    //創建文件管理器
    NSFileManager * fileManager = [NSFileManager defaultManager];


    
    //推斷文件是否存在
    if ([fileManager fileExistsAtPath:file] == NO) {
        
        //然后把包里的文件復制到documents目錄里
        [fileManager copyItemAtPath:bundleFile toPath:file error:nil];
        //UTF8tring 會把C語言 轉換為 OC字符串    
    }
    sqlite3_open([file UTF8String], &db);
    
    return db;
}

(3) 關閉數據庫

原型:
SQLITE_API int sqlite3_close(sqlite3 *);

參考代碼例如以下:
/關閉數據庫
+ (void)close
{
    sqlite3_close(db);
    db = nil;    
}

   (4) SQL語句操作


  (一)  sqlite3_exec:

原型:

SQLITE_API 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 語句的函數。

1個參數不再說了,是前面open函數得到的指針。說了是重要數據結構。

2個參數const char *sql 是一條 sql 語句。以/0結尾。

3個參數sqlite3_callback 是回調,當這條語句運行之后,sqlite3會去調用你提供的這個函數。

4個參數void * 是你所提供的指針,你能夠傳遞不論什么一個指針參數到這里,這個參數終於會傳到回調函數里面。假設不須要傳遞指針給回調函數。能夠填NULL。等下我們再看回調函數的寫法,以及這個參數的使用。

5個參數char ** errmsg 是錯誤信息。

注意是指針的指針。sqlite3里面有非常多固定的錯誤信息。

運行 sqlite3_exec之后,運行失敗時能夠查閱這個指針(直接 printf(%s/n,errmsg))得到一串字符串信息,這串信息告訴你錯在什么地方。sqlite3_exec函數通過改動你傳入的指針的指針,把你提供的指針指向錯誤提示信息,這樣sqlite3_exec函數外面就能夠通過這個 char*得到詳細錯誤提示。

說明:通常,sqlite3_callback 和它后面的 void * 這兩個位置都能夠填 NULL

NULL表示你不須要回調。比方你做 insert 操作,做 delete 操作,做update 操作,就沒有必要使用回調。而當你做 select 時,就要使用回調。由於 sqlite3 把數據查出來,得通過回調告訴你查出了什么數據。

參考代碼例如以下:

- (void)deleteButton
{
    //打開數據庫
    sqlite3 * db = [DB open];
    //運行刪除    
int falg =  sqlite3_exec(db, "delete from BJS140523 where sName like '坐'", NULL, NULL, nil);
    NSLog(@"444444  falg = %d",falg);
}



(二 ) sqlite3_prepare_v2:

原型:

SQLITE_API 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 */
<span style="font-family: 'Comic Sans MS';">   const char **pzTail     /* OUT: Pointer to unused portion of zSql */</span>

參考代碼例如以下:

   int flag =sqlite3_prepare_v2(db, "select * from BJS140523 "  , -1, &stmt, nil);






(三) sqlite3_column_

原型:

SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);


參考代碼例如以下:

 int sID = sqlite3_column_int(stmt, 0);//列的編號從0開始
 const unsigned char * sName = sqlite3_column_text(stmt, 1);
 int sAge = sqlite3_column_int(stmt, 2);
 const unsigned char * sSex = sqlite3_column_text(stmt, 3);


(四)sqlite3_step()


原型:

SQLITE_API int sqlite3_step(sqlite3_stmt*);


參考代碼例如以下:

if (falg == SQLITE_OK) {
        sqlite3_step(stmt);
    }


(五)sqlite3_finalize()

原型:

SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);


參考代碼例如以下:

sqlite3_finalize(stmt);


(六) sqlite3_bind_text



//bind  綁定 

原型:

SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);
SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int);
SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);
SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
參考代碼例如以下:

    int falg = sqlite3_prepare_v2(db, "update BJS140523 set sSex = ?,sAge = ?

where sID = ?

", -1, &stmt, nil); //綁定 //問號是從 1 開始的 sqlite3_bind_text(stmt,1,[sex UTF8String], -1, NULL); sqlite3_bind_int(stmt, 2, age); sqlite3_bind_int(stmt, 3, sID);

































免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM