iOS之SQLite使用詳解


數據庫的特征:

以一定方式存儲在一起
能為多個用戶分享
具有盡可能少的冗余代碼
與程序彼此獨立的數據集
SQLite

SQLite是一個輕量級關系數據庫,最初的設計目標是用於嵌入式系統,它占用資源非常少.在iOS中,只需要加入li’blibsqlite3.0依賴以及引入sqlite3.h頭文件即可.
SQLite是無類型的數據庫,可以保存任何類型的數據,對於SQLite來說對字段不指定類型是完全有效的
SQLite近似類似規則

如果類型字符串中包含”INT”,那么該字段的親緣關系是INTEGER
如果類型字符串中包含”CHAR”, “CLOB”或”TEXT”,那么該字段的親緣類型是TEXT,如VARCHAR
如果類型字符串中包含”BLOB”,那么該字段的親緣類型是NONE
如果類型字符串中包含”REAL”, “FLOA”或”DOUB”, 那么該字段的親緣類型是REAL
其余情況下,字段的親緣類型為NUMERIC
SQLite字段的約束條件

not null —–非空
unique ——唯一
primary key ——主鍵
foreign key ———外鍵
check ———條件檢查,確保一列中所有的值滿足一定條件
default ——默認
autoincrement — 自增型變量,該字段數據如果為整型可以自動加1
SQLite字段約束條件: PRIMARY KEY — 主鍵

首先,數據表中每一條記錄都有一個主鍵,這就像我們的身份證號碼等,反過來說每一個主鍵對應着一條數據記錄,所以,主鍵必須是唯一的
其次,一般情況主鍵同時也是一個索引,所以通過主鍵查找記錄速度比較快
第三,在關系類型庫中,一個表的主鍵可以作為另外一個表的外鍵,這樣,這兩個表之間就通過這個鍵建立了關系
最后,主鍵一般是整數或者字符串,只要保證唯一就行,在SQLite中,主鍵如果是整型類型,該列的值可以自動增長
SQLite語句

建表命令(create table)
這里寫圖片描述

數據插入命令(insert)
這里寫圖片描述

數據庫更新命令(updata)
這里寫圖片描述

數據庫刪除命令(delete)
這里寫圖片描述

數據庫檢索命令(select)
這里寫圖片描述

iOS的數據庫技術的實現:

代碼:

#pragma mark - 1.引入<sqlite3.h>頭文件
//添加libsqlite3.0.tbd

#import <sqlite3.h>

static sqlite3 *db;//是指向數據庫的指針,我們其他操作都是用這個指針來完成

#pragma mark - 2.打開數據庫

- (void)openSqlite {
    //判斷數據庫是否為空,如果不為空說明已經打開
    if(db != nil) {
        NSLog(@"數據庫已經打開");
        return;
    }

    //獲取文件路徑
    NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *strPath = [str stringByAppendingPathComponent:@"my.sqlite"];
    NSLog(@"%@",strPath);
    //打開數據庫
    //如果數據庫存在就打開,如果不存在就創建一個再打開
    int result = sqlite3_open([strPath UTF8String], &db);
    //判斷
    if (result == SQLITE_OK) {
        NSLog(@"數據庫打開成功");
    } else {
        NSLog(@"數據庫打開失敗");
    }
}

#pragma mark - 3.增刪改查
//創建表格
- (void)createTable {
    //1.准備sqlite語句
    NSString *sqlite = [NSString stringWithFormat:@"create table if not exists 'student' ('number' integer primary key autoincrement not null,'name' text,'sex' text,'age'integer)"];
    //2.執行sqlite語句
    char *error = NULL;//執行sqlite語句失敗的時候,會把失敗的原因存儲到里面
    int result = sqlite3_exec(db, [sqlite UTF8String], nil, nil, &error);
    //3.sqlite語句是否執行成功

    if (result == SQLITE_OK) {
        NSLog(@"創建表成功");
    } else {
        NSLog(@"創建表失敗");
    }
}

//添加數據
- (void)addStudent:(student *)stu {
    //1.准備sqlite語句
    NSString *sqlite = [NSString stringWithFormat:@"insert into student(number,name,age,sex) values ('%ld','%@','%@','%ld')",stu.number,stu.name,stu.sex,stu.age];
    //2.執行sqlite語句
    char *error = NULL;//執行sqlite語句失敗的時候,會把失敗的原因存儲到里面
    int result = sqlite3_exec(db, [sqlite UTF8String], nil, nil, &error);
    if (result == SQLITE_OK) {
        NSLog(@"添加數據成功");
    } else {
        NSLog(@"添加數據失敗");
    }
}

//刪除數據
- (void)delete:(student*)stu {
    //1.准備sqlite語句
    NSString *sqlite = [NSString stringWithFormat:@"delete from student where number = '%ld'",stu.number];
    //2.執行sqlite語句
    char *error = NULL;//執行sqlite語句失敗的時候,會把失敗的原因存儲到里面
    int result = sqlite3_exec(db, [sqlite UTF8String], nil, nil, &error);
    if (result == SQLITE_OK) {
        NSLog(@"刪除數據成功");
    } else {
        NSLog(@"刪除數據失敗%s",error);
    }
}

//修改數據
- (void)updataWithStu:(student *)stu {
    //1.sqlite語句
    NSString *sqlite = [NSString stringWithFormat:@"update student set name = '%@',sex = '%@',age = '%ld' where number = '%ld'",stu.name,stu.sex,stu.age,stu.number];
    //2.執行sqlite語句
    char *error = NULL;//執行sqlite語句失敗的時候,會把失敗的原因存儲到里面
    int result = sqlite3_exec(db, [sqlite UTF8String], nil, nil, &error);
    if (result == SQLITE_OK) {
        NSLog(@"修改數據成功");
    } else {
        NSLog(@"修改數據失敗");
    }
}

//查詢所有數據
- (NSMutableArray*)selectWithStu {
    NSMutableArray *array = [[NSMutableArray alloc] init];
    //1.准備sqlite語句
    NSString *sqlite = [NSString stringWithFormat:@"select * from student"];
    //2.伴隨指針
    sqlite3_stmt *stmt = NULL;
    //3.預執行sqlite語句
    int result = sqlite3_prepare(db, sqlite.UTF8String, -1, &stmt, NULL);//第4個參數是一次性返回所有的參數,就用-1
    if (result == SQLITE_OK) {
        NSLog(@"查詢成功");
        //4.執行n次
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            student *stu = [[student alloc] init];
            //從伴隨指針獲取數據,第0列
            stu.number = sqlite3_column_int(stmt, 0);
            //從伴隨指針獲取數據,第1列
            stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)] ;
            //從伴隨指針獲取數據,第2列
            stu.sex = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)] ;
            //從伴隨指針獲取數據,第3列
            stu.age = sqlite3_column_int(stmt, 3);
            [array addObject:stu];
        }
    } else {
        NSLog(@"查詢失敗");
    }
//5.關閉伴隨指針
    sqlite3_finalize(stmt);
    return array;
}

#pragma mark - 4.關閉數據庫
- (void)closeSqlite {

    int result = sqlite3_close(db);
    if (result == SQLITE_OK) {
        NSLog(@"數據庫關閉成功");
    } else {
        NSLog(@"數據庫關閉失敗");
    }
}


免責聲明!

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



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