iOS Sqlite筆記

躍然發表於2015-12-07

一、建立資料庫及表


 //開啟資料庫 如果沒有就建立
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"data.sqlite"];// 資料庫名字也可以不帶字尾


    NSLog(@"%@",path);

    int success =  sqlite3_open(path.UTF8String, &_db);

    if (success == SQLITE_OK) {
        NSLog(@"建立資料庫成功!");
        //2.建立表 (指定欄位  -> 需求: 儲存 學生資訊 id  name score)
        //用sql語句 來建立
        //編寫sql語句
        NSString *str = @"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, score REAL NOT NULL)";

        //執行sql語句
        int success_t =  sqlite3_exec(_db, str.UTF8String, NULL, NULL, NULL);
        if (success_t == SQLITE_OK) {
            NSLog(@"建立表成功!");
        }else{
            NSLog(@"建立表失敗!");
        }


    }else{
        NSLog(@"建立資料庫失敗!");
    }

二、向資料庫新增資料


//3.增加 資料 (100條 資料隨機)
    for (int i = 0; i <100; i++) {

        NSString *strName = [NSString stringWithFormat:@"changyou-%d",i];

        NSString *sqlStr = [NSString stringWithFormat:@"INSERT INTO t_student (name ,score)VALUES('%@',%.02f)",strName,arc4random_uniform(1000)/10.0];

        //執行
        int success =   sqlite3_exec(_db, sqlStr.UTF8String, NULL, NULL, NULL);
        if (success == SQLITE_OK) {
            NSLog(@"新增成功!");
        }else{
            NSLog(@"新增失敗!");
        }

    }

三、刪除資料

//4.刪除 資料 (70 - 80 分數)
    NSString *sqlStr = @"DELETE FROM t_student WHERE score > 80.0";

    //執行
    int success =   sqlite3_exec(_db, sqlStr.UTF8String, NULL, NULL, NULL);
    if (success == SQLITE_OK) {
        NSLog(@"刪除成功!");
    }else{
        NSLog(@"刪除失敗!");
    }

四、修改資料

    //5.修改 資料 (修改分數小於60.0為60.0)
    NSString *sqlStr = @"UPDATE t_student SET score = 60.0 WHERE score < 60.0";

    //執行
    int success = sqlite3_exec(_db, sqlStr.UTF8String, NULL, NULL, NULL);
    if (success == SQLITE_OK) {
        NSLog(@"修改成功!");
    }else{
        NSLog(@"修改失敗!");
    }

五、查詢資料

//6.查詢資料 ( score >= 60)
    //NSString *sqlStr = @"SELECT * FROM t_student WHERE score > 60.0 ORDER BY score DESC;";
    //查詢資料 ( name  中帶 you 數字)
    NSString *sqlStr = @"SELECT * FROM t_student WHERE name LIKE '%you%'";
    //查詢之後  把結果放在 stmt物件
    // 儲存所有的結果集
    sqlite3_stmt *stmt = nil;

    sqlite3_prepare_v2(_db, sqlStr.UTF8String, -1, &stmt, NULL);

    //獲取到所有結果  每一步  查詢到一條記錄
    while (sqlite3_step(stmt) == SQLITE_ROW) {
        //取出一條記錄
        // name TEXT    column
        const unsigned char * name =  sqlite3_column_text(stmt, 1);
        NSString *strName = [NSString stringWithCString:(const char *)name encoding:NSUTF8StringEncoding];
        //score  REAL
        double score =  sqlite3_column_double(stmt, 2);

        NSLog(@"name = %@  score = %f",strName,score);

    }

六、關閉資料庫

// 關閉資料庫 
// 資料庫在合適位置關閉,根據需要,靈活掌握
//sqlite3_close(_db);

七、第三方類庫FMDB

FMDatabase這個類是執行緒不安全的,如果在多個執行緒中同時使用一個FMDatabase例項,會造成資料混亂等問題
為了保證執行緒安全,FMDB提供方便快捷的FMDatabaseQueue類
FMDatabaseQueue的建立
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];

八、附:

1.開啟資料庫
int sqlite3_open(
    const char *filename,   // 資料庫的檔案路徑
    sqlite3 **ppDb          // 資料庫例項
);

2.執行任何SQL語句
int sqlite3_exec(
    sqlite3*,                                  // 一個開啟的資料庫例項
    const char *sql,                           // 需要執行的SQL語句
    int (*callback)(void*,int,char**,char**),  // SQL語句執行完畢後的回撥
    void *,                                    // 回撥函式的第1個引數
    char **errmsg                              // 錯誤資訊
);

3.檢查SQL語句的合法性(查詢前的準備)
int sqlite3_prepare_v2(
    sqlite3 *db,            // 資料庫例項
    const char *zSql,       // 需要檢查的SQL語句
    int nByte,              // SQL語句的最大位元組長度
    sqlite3_stmt **ppStmt,  // sqlite3_stmt例項,用來獲得資料庫資料
    const char **pzTail
);

4.查詢一行資料
int sqlite3_step(sqlite3_stmt*); // 如果查詢到一行資料,就會返回SQLITE_ROW

5.利用stmt獲得某一欄位的值(欄位的下標從0開始)
double sqlite3_column_double(sqlite3_stmt*, int iCol);  // 浮點資料
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型資料
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型資料
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進位制文字資料
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);  // 字串資料

九、Demo下載路徑

  1. Sqlite增刪改查示例:
    http://git.oschina.net/changyou/MySqliteDemo/repository/archive/master

  2. FMDB執行緒安全使用Demo:
    http://git.oschina.net/changyou/MyFMDBDemo/repository/archive/master

相關文章