SQLite的基本封裝

來源:互聯網
上載者:User

標籤:ios   sqlite   

當我們使用SQLite時,都需要先建立資料庫建立資料表,再執行相應地sql語句,這樣不利於對資料庫操作進行統一管理,也不符合物件導向的思想,當我們的需求發生改變時,例如資料庫表名改了,或者是要添加幾個欄位,這時候就會出現一種四處找資料庫作業碼的情況,如果是一處兩處還好,但如果是上百處,那就會是一個很大的工作量。所以我們可以來定義一個工具類SQLManager,統一對資料庫操作進行管理。     工具類SQLManager一般都會被定義為單例模式,正常情況下,系統中SQLManager對象只需儲存一份,.h檔案上對外提供一個擷取單例的介面
/** 擷取單例對象 */+ (instancetype)shareManage;
.m檔案中實現該單例方法
static SQLManager *_instance;+ (instancetype)shareManage{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _instance = [[SQLManager alloc] init];    });    return _instance;}

既然是資料庫管理工具類,要對資料庫進行操作,同樣地我們需要建立資料庫還有資料庫表,建立只需要一個次,所以可以將建立代碼寫在initialize方法裡面,initialize方法是當這個類第一次被使用的時候就會調用該方法,而且在app的生命週期中只會調用一次
+ (void)initialize{    // 拼接資料庫地址    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];    NSString *sqlFile = [path stringByAppendingPathComponent:@"student.sqlite"];    // 開啟資料    int result = sqlite3_open(sqlFile.UTF8String, &_db);// [self db]    // 判斷是否開啟成功    if (result == SQLITE_OK) {        NSLog(@"開啟成功");        // 3.1建立表        NSString *sql = @"CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT , name TEXT, age INTEGER, score REAL);";        result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, NULL);    }}
現在我們讓工具類向外提供一個方法,用來向資料庫插入一條學生資料
/** 插入學生資料 */- (BOOL)insertStudent:(HMStudent *)student;
當然我們首先需要定義一個學生模型來儲存資料,學生類中得欄位根資料庫表中得欄位一一對應
@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) int age;@property (nonatomic, assign) double score;@property (nonatomic, assign) int ID;
insertStudent:方法的實現如下
- (BOOL)insertStudent:(HMStudent *)student{    NSString *sql = [NSString stringWithFormat: @"INSERT INTO t_student(age, score, name) VALUES (%d, %f, '%@');", student.age, student.score, student.name];    int result =  sqlite3_exec(_db, sql.UTF8String, NULL, NULL, NULL);    if (result == SQLITE_OK) {        return YES;    }    return NO;}
如此該方法就封裝了一個插入操作。再來到我們需要使用資料庫操作的類裡面,只需要匯入工具類的標頭檔,就可以以物件導向的方式向資料庫中插入一條資料
    Student *stu = [[Student alloc] init];    stu.name = @"lnj";    stu.age = 30;    stu.score = 100.0;    if ([[SQLManager shareManage]insertStudent:stu]) {        NSLog(@"插入成功");    }

以此類推,我們可以封裝其他的刪除修改操作,以後如果出現什麼資料庫需求修改時,我們就只用專心的修改工具類就行了,就不用四處的去找資料庫相關操作的代碼了,而且相比較於之間操作資料庫的方式,以上代碼更具備閱讀性。查詢的方式比較特殊,現在就來簡單的實現以下。同樣需要對外提供一個借口
- (NSArray *)query;
該方法用來查詢所有的資料,並返回一個學生模型的數組
NSString *sql = @"SELECT * FROM t_student;";    sqlite3_stmt *stemt = NULL;    sqlite3_prepare_v2(_db, sql.UTF8String, -1, &stemt, NULL);    // 判斷有沒有查詢結果    NSMutableArray *arrM = [NSMutableArray array];    while (sqlite3_step(stemt) == SQLITE_ROW) {        // 取出查詢到得結果        const unsigned char *name = sqlite3_column_text(stemt, 1);        int age = sqlite3_column_int(stemt, 2);        double score = sqlite3_column_double(stemt, 3);        HMStudent *stu = [[HMStudent alloc] init];        stu.name = [NSString stringWithUTF8String:name];        stu.age = age;        stu.score = score;        [arrM addObject:stu];    }    return arrM;

當我們需要在控制器中擷取資料庫中得資料時,只要如下幾行代碼
NSArray *arr = [[SQLManager shareManage] query];    for (Student *stu in arr) {        NSLog(@"%@", stu);    }

so easy!你會發現控制器需要關注的代碼越來越少,代碼會越來越簡潔,這就是封裝的魅力!

SQLite的基本封裝

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.