前言
采用 SQLite 數(shù)據(jù)庫來存儲數(shù)據(jù)缓窜。SQLite 作為一中小型數(shù)據(jù)庫,應(yīng)用 iOS 中粥脚,跟前三種保存方式相比窃肠,相對比較復(fù)雜一些。
注意:寫入數(shù)據(jù)庫刷允,字符串可以采用 char 方式冤留,而從數(shù)據(jù)庫中取出 char 類型,當(dāng) char 類型有表示中文字符時树灶,會出現(xiàn)亂碼纤怒。這是因?yàn)閿?shù)據(jù)庫默認(rèn)使用 ASCII 編碼方式。所以要想正確從數(shù)據(jù)庫中取出中文天通,需要用 NSString 來接收從數(shù)據(jù)庫取出的字符串泊窘。
sqlite 的方法:
sqlite3 *db? ? ? ? ? ? 數(shù)據(jù)庫句柄,跟文件句柄很類似? ? sqlite3_stmt *stmt? ? ? 這個相當(dāng)于 ODBC 的 Command 對象,用于保存編譯好的 SQL 語句? ? sqlite3_open()? ? ? ? ? 打開數(shù)據(jù)庫烘豹,沒有數(shù)據(jù)庫時創(chuàng)建瓜贾。? ? sqlite3_exec()? ? ? ? ? 執(zhí)行非查詢的 sql 語句? ? Sqlite3_step()? ? ? ? ? 在調(diào)用 sqlite3_prepare 后,使用這個函數(shù)在記錄集中移動携悯。? ? Sqlite3_close()? ? ? ? 關(guān)閉數(shù)據(jù)庫文件? ? 還有一系列的函數(shù)阐虚,用于從記錄集字段中獲取數(shù)據(jù),如:? ? sqlite3_column_text()? 取 text 類型的數(shù)據(jù)蚌卤。? ? sqlite3_column_blob()? 取 blob 類型的數(shù)據(jù)? ? sqlite3_column_int()? ? 取int類型的數(shù)據(jù)
1、環(huán)境配置
添加動態(tài)庫
在 TARGETS => Build Phases => Link Binary With Libraries => +(添加) => Add Other... => command + shit + g => 輸入 /usr/lib 找到一下文件并添加:libsqlite3.0.dylib
或者在 TARGETS -> Build Settings -> Linking -> Other Linker Flags 中添加 -l< 所需 dylib 的名稱 >:-lsqlite3.0
添加頭文件:
#import"sqlite3.h"
配置數(shù)據(jù)庫路徑
// 設(shè)置數(shù)據(jù)庫文件路徑NSString*databaseFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/mydb.sqlite"];// 創(chuàng)建數(shù)據(jù)庫句柄sqlite3 *db;char*error;
2奥秆、打開數(shù)據(jù)庫
// 打開數(shù)據(jù)庫逊彭,數(shù)據(jù)庫文件不存在時,自動創(chuàng)建文件if(sqlite3_open([databaseFilePath UTF8String], &db) == SQLITE_OK) {NSLog(@"sqlite dadabase is opened.");? ? }else{NSLog(@"sqlite dadabase open fail.");? ? }
3眯亦、創(chuàng)建數(shù)據(jù)表
/*
sql 語句纬凤,專門用來操作數(shù)據(jù)庫的語句嚎花。
create table if not exists 是固定的,如果表不存在就創(chuàng)建囊榜。
myTable() 表示一個表,myTable 是表名亥宿,小括號里是字段信息卸勺。
字段之間用逗號隔開,每一個字段的第一個單詞是字段名烫扼,第二個單詞是數(shù)據(jù)類型曙求,primary key 代表主鍵,autoincrement 是自增映企。
*/NSString*createSql =@"create table if not exists myTable(id integer primary key autoincrement, name text, age integer, address text)";if(sqlite3_exec(db, [createSql UTF8String],NULL,NULL, &error) == SQLITE_OK) {NSLog(@"create table is ok.");? ? }else{NSLog(@"error: %s", error);// 每次使用完畢清空 error 字符串悟狱,提供給下一次使用sqlite3_free(error);? ? }
4、插入記錄
NSString*insertSql =@"insert into myTable(name, age, address) values('小新', '8', '東城區(qū)')";if(sqlite3_exec(db, [insertSql UTF8String],NULL,NULL, &error) == SQLITE_OK) {NSLog(@"insert operation is ok.");? ? }else{NSLog(@"error: %s", error);// 每次使用完畢清空 error 字符串堰氓,提供給下一次使用sqlite3_free(error);? ? }
5挤渐、修改記錄
NSString*updateSql =@"update myTable set name = '小白', age = '10', address = '西城區(qū)' where id = 2";if(sqlite3_exec(db, [updateSql UTF8String],NULL,NULL, &error) == SQLITE_OK) {NSLog(@"update operation is ok.");? ? }else{NSLog(@"error: %s", error);// 每次使用完畢清空 error 字符串,提供給下一次使用sqlite3_free(error);? ? }
6双絮、刪除記錄
NSString*deleteSql =@"delete from myTable where id = 3";if(sqlite3_exec(db, [deleteSql UTF8String],NULL,NULL, &error) == SQLITE_OK) {NSLog(@"delete operation is ok.");? ? }else{NSLog(@"error: %s", error);// 每次使用完畢清空 error 字符串浴麻,提供給下一次使用sqlite3_free(error);? ? }
7、查詢記錄
sqlite3_stmt *statement;// @"select * from myTable"? 查詢所有 key 值內(nèi)容NSString*selectSql =@"select id, name, age, address from myTable";if(sqlite3_prepare_v2(db, [selectSql UTF8String],-1, &statement,nil) == SQLITE_OK) {while(sqlite3_step(statement) == SQLITE_ROW) {// 查詢 id 的值int_id= sqlite3_column_int(statement,0);// 查詢 name 的值NSString*name = [NSStringstringWithUTF8String:(char*)sqlite3_column_text(statement,1)];// 查詢 ageintage = sqlite3_column_int(statement,2);// 查詢 name 的值NSString*address = [NSStringstringWithUTF8String:(char*)sqlite3_column_text(statement,3)];NSLog(@"id: %i, name: %@, age: %i, address: %@", _id, name, age, address);? ? ? ? }? ? }else{NSLog(@"select operation is fail.");? ? }? ? ? ? ? ? sqlite3_finalize(statement);