iOS - OC SQLite 數(shù)據(jù)庫(kù)存儲(chǔ)

前言

采用 SQLite 數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù)。SQLite 作為一中小型數(shù)據(jù)庫(kù),應(yīng)用 iOS 中,跟前三種保存方式相比,相對(duì)比較復(fù)雜一些。

注意:寫(xiě)入數(shù)據(jù)庫(kù),字符串可以采用 char 方式,而從數(shù)據(jù)庫(kù)中取出 char 類型,當(dāng) char 類型有表示中文字符時(shí),會(huì)出現(xiàn)亂碼。這是因?yàn)閿?shù)據(jù)庫(kù)默認(rèn)使用 ASCII 編碼方式。所以要想正確從數(shù)據(jù)庫(kù)中取出中文,需要用 NSString 來(lái)接收從數(shù)據(jù)庫(kù)取出的字符串。

sqlite 的方法:

sqlite3 *db? ? ? ? ? ? 數(shù)據(jù)庫(kù)句柄,跟文件句柄很類似? ? sqlite3_stmt *stmt? ? ? 這個(gè)相當(dāng)于 ODBC 的 Command 對(duì)象,用于保存編譯好的 SQL 語(yǔ)句? ? sqlite3_open()? ? ? ? ? 打開(kāi)數(shù)據(jù)庫(kù),沒(méi)有數(shù)據(jù)庫(kù)時(shí)創(chuàng)建。? ? sqlite3_exec()? ? ? ? ? 執(zhí)行非查詢的 sql 語(yǔ)句? ? Sqlite3_step()? ? ? ? ? 在調(diào)用 sqlite3_prepare 后,使用這個(gè)函數(shù)在記錄集中移動(dòng)。? ? Sqlite3_close()? ? ? ? 關(guān)閉數(shù)據(jù)庫(kù)文件? ? 還有一系列的函數(shù),用于從記錄集字段中獲取數(shù)據(jù),如:? ? sqlite3_column_text()? 取 text 類型的數(shù)據(jù)。? ? sqlite3_column_blob()? 取 blob 類型的數(shù)據(jù)? ? sqlite3_column_int()? ? 取int類型的數(shù)據(jù)


1、環(huán)境配置

添加動(dòng)態(tài)庫(kù)

在 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ù)庫(kù)路徑

// 設(shè)置數(shù)據(jù)庫(kù)文件路徑NSString*databaseFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/mydb.sqlite"];// 創(chuàng)建數(shù)據(jù)庫(kù)句柄sqlite3 *db;char*error;


2、打開(kāi)數(shù)據(jù)庫(kù)

// 打開(kāi)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)文件不存在時(shí),自動(dòng)創(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 語(yǔ)句,專門(mén)用來(lái)操作數(shù)據(jù)庫(kù)的語(yǔ)句。

create table if not exists 是固定的,如果表不存在就創(chuàng)建。

myTable() 表示一個(gè)表,myTable 是表名,小括號(hào)里是字段信息。

字段之間用逗號(hào)隔開(kāi),每一個(gè)字段的第一個(gè)單詞是字段名,第二個(gè)單詞是數(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);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容