iOS Sqlite 數(shù)據(jù)庫

什么是數(shù)據(jù)庫

數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結(jié)構(gòu)來組織屎暇、存儲和管理數(shù)據(jù)的倉庫

數(shù)據(jù)庫有哪些

關(guān)系型數(shù)據(jù)庫

對象型數(shù)據(jù)庫

主要關(guān)系型數(shù)據(jù)庫:

PC端:Oracle坯汤、MySQL脑豹、SQL Server申屹、Access丛晌、DB2镜廉、Sybase

嵌入式\移動客戶端:SQLite

什么是 Sqlite 數(shù)據(jù)庫

SQLite是一款輕型的嵌入式數(shù)據(jù)庫,主流的移動客戶端包括大多數(shù)安卓手機和部分的蘋果手機都會使用這種輕量級的數(shù)據(jù)庫

SQLite與許多其它數(shù)據(jù)庫管理系統(tǒng)不同,它不是一個客戶端/服務(wù)器結(jié)構(gòu)的數(shù)據(jù)庫引擎寓涨,而是被集成在用戶程序中。

SQLite庫鏈接到程序中氯檐,并成為它的一個組成部分戒良。這個庫也可被動態(tài)鏈接。應(yīng)用程序經(jīng)由編程語言內(nèi)的直接API調(diào)用來使用SQlite的功能冠摄,這在減少數(shù)據(jù)庫訪問延遲上有積極作用糯崎,因為在一個單一進程中的函數(shù)調(diào)用比跨進程通信更有效率。SQLite將整個數(shù)據(jù)庫河泳,包括定義沃呢、表、索引以及數(shù)據(jù)本身拆挥,作為一個單獨的薄霜、可跨平臺使用的文件存儲在主機中。它采用了在寫入數(shù)據(jù)時將整個數(shù)據(jù)庫文件加鎖的簡單設(shè)計纸兔。盡管寫操作只能串行進行惰瓜,但SQLite的讀操作可以多任務(wù)同時進行。

它的設(shè)計目標是嵌入式的汉矿,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它崎坊,它占用資源非常的低,在嵌入式設(shè)備中洲拇,可能只需要幾百K的內(nèi)存就夠了奈揍。它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時能夠跟很多程序語言相結(jié)合赋续,比如 Tcl男翰、C#、PHP蚕捉、Java等 奏篙,SQLite第一個Alpha版本誕生于2000年5月。 至今已經(jīng)有14個年頭,SQLite也迎來了一個版本 SQLite 3已經(jīng)發(fā)布秘通。-來自SQLite維基百科

主鍵? primary key

// integer類型的id作為t_student表的主鍵

create? table t_student (id integer primary key,name text);

//主鍵字段:只要聲明為primary key为严,就說明是一個主鍵字段

外鍵約束

利用外鍵約束可以用來建立表與表之間的聯(lián)系

外鍵的一般情況是:一張表的某個字段,引用著另一張表的主鍵字段

SQLite的特性

1. ACID事務(wù)

ACID肺稀,是指在可靠數(shù)據(jù)庫管理系統(tǒng)(DBMS)中第股,事務(wù)(transaction)所應(yīng)該具有的四個特性:原子性(Atomicity)、一致性(Consistency)话原、隔離性(Isolation)夕吻、持久性(Durability). 原子性意味著數(shù)據(jù)庫中的事務(wù)執(zhí)行是作為原子。即不可再分繁仁,整個語句要么執(zhí)行涉馅,要么不執(zhí)行。一致性指數(shù)據(jù)庫事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性以及業(yè)務(wù)邏輯上的一致性黄虱。例如對銀行轉(zhuǎn)帳事務(wù)稚矿,不管事務(wù)成功還是失敗,應(yīng)該保證事務(wù)結(jié)束后ACCOUNTS表中Tom和Jack的存款總額為2000元捻浦。事務(wù)的隔離性是多個用戶并發(fā)訪問數(shù)據(jù)庫時晤揣,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作數(shù)據(jù)所干擾朱灿,多個并發(fā)事務(wù)之間要相互隔離昧识。持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的盗扒,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響跪楞。

2. 零配置 – 無需安裝和管理配置

3.儲存在單一磁盤文件中的一個完整的數(shù)據(jù)庫

特性總結(jié):

sqlite數(shù)據(jù)庫是一種輕量級數(shù)據(jù)庫,被集成到用戶程序中

占用資源非常的低环疼,在嵌入式設(shè)備中习霹,占用內(nèi)存很低而查詢效率很高,因此廣泛應(yīng)用在各種移動客戶端中炫隶;

簡單淋叶,輕巧的足夠小(C語言API ,4.43M)

快(比大部分的普通數(shù)據(jù)庫都快)

支持的數(shù)據(jù)庫大小至2TB


SQLite 數(shù)據(jù)類型介紹

每個存儲在 SQLite 數(shù)據(jù)庫中的值都具有以下存儲類之一:

null( NULL ) ? ? ? ? ? ? ?值是一個 NULL 值伪阶。

integer( INTEGER ) ? ?值是一個帶符號的整數(shù)煞檩,根據(jù)值的大小存儲在 1、2栅贴、3斟湃、4、6 或 8 字節(jié)中檐薯。

real( REAL ) ? ? ? ? ? ? ? ?值是一個浮點值凝赛,存儲為 8 字節(jié)的 IEEE 浮點數(shù)字注暗。

text (TEXT) ? ? ? ? ? ? ? ?值是一個文本字符串,使用數(shù)據(jù)庫編碼(UTF-8墓猎、UTF-16BE 或 UTF-16LE)存儲捆昏。

blob( BLOB) ? ? ? ? ? ? ? ?值是一個 blob 數(shù)據(jù),完全根據(jù)它的輸入存儲毙沾。

sqlite 的方法簡介

sqlite3 ? ? *db, 數(shù)據(jù)庫句柄骗卜,跟文件句柄FILE很類似

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ù)庫文件

sqlite3_stmt? ? ? *stmt, 這個相當于ODBC的Command對象烤宙,用于保存編譯好的SQL語句

sqlite3_column_text(), 取text類型的數(shù)據(jù)遍烦。

sqlite3_column_blob(),取blob類型的數(shù)據(jù)

sqlite3_column_int(), 取int類型的數(shù)據(jù)


如何在iOS中使用sqlite?

第一步 sqlite.h文件的引入

首先是打開和關(guān)閉數(shù)據(jù)庫门烂,打開和創(chuàng)建數(shù)據(jù)庫都是sqlite3_open函數(shù)乳愉,如果filename已經(jīng)創(chuàng)建那就是打開。

NSString *filename;//數(shù)據(jù)庫文件路徑

sqlite3 *database; //sqlite3數(shù)據(jù)庫句柄的指針

//打開數(shù)據(jù)庫

- (int) open{

int rc=sqlite3_open([filename UTF8String], &database);

if (rc) {

sqlite3_close(database);

NSLog(@"open database failed");

}

return rc;

}

- (void) close{//關(guān)閉數(shù)據(jù)庫

if (database!=NULL) {

sqlite3_close(database);

}

}

執(zhí)行查詢

[self open];

// 查

strsql = "select * from users";

// SQLITE_API int sqlite3_prepare_v2(

// sqlite3 *db, /* Database handle */

// const char *zSql, /* SQL statement*/

// int nByte, /* 結(jié)果集的最大長度屯远。*/

// sqlite3_stmt **ppStmt, /* OUT: 結(jié)果集 */

// const char **pzTail /* OUT:指向結(jié)果集沒有用到的內(nèi)存部分的指針。 */

// );

sqlite3_stmt* rc;//陳述式句柄

if (sqlite3_prepare_v2(db, strsql, -1, &rc, NULL)!=SQLITE_OK) {

}

// sqlite3_step講結(jié)果集數(shù)據(jù)指針指向下一個元素捕虽。

// 這個函數(shù)的返回值如果是SQLITE_ROW就表示我們的結(jié)果集里面有數(shù)據(jù)慨丐。

// 否則我們的結(jié)果集就是空的。

while (sqlite3_step(rc)==SQLITE_ROW) {

// sqlite3_column系列函數(shù)泄私。一般有兩個輸入?yún)?shù)房揭。第一個是結(jié)果集指針,第二是數(shù)據(jù)所在列的序號晌端。

// 比如我們現(xiàn)在用的sqlite3_column_int和sqlite3_column_text捅暴。

printf("id:%d | username:%s | password:%s \n",sqlite3_column_int(rc,? ? ? ? ? ? ? 0),sqlite3_column_text(rc, 1),sqlite3_column_text(rc, 2));

}

// 查完后一定要釋放結(jié)果集。

sqlite3_finalize(rc);

[self close];


增咧纠,改蓬痒,刪除,都用 sqlite3_exec函數(shù)

//執(zhí)行 insert,update,delete 等非查詢SQL語句

- (int)executeNonQuery:(NSString *)sql error:(NSError **)error {

int rc;

char *errmsg;

rc = [self open];

if (rc) {

//錯誤處理

if (error != NULL) {

NSDictionary *eDict =

[NSDictionary dictionaryWithObject:@"open database failed"

forKey:NSLocalizedDescriptionKey];

*error =

[NSError errorWithDomain:kSqliteErrorDomain code:rc userInfo:eDict];

}

return rc;

}

rc = sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errmsg);

if (rc != SQLITE_OK) {

if (error != NULL) {

NSDictionary *eDict =

[NSDictionary dictionaryWithObject:@"exec sql error"

forKey:NSLocalizedDescriptionKey];

*error =

[NSError errorWithDomain:kSqliteErrorDomain code:rc userInfo:eDict];

}

NSLog(@"%s", errmsg);

sqlite3_free(errmsg);

}

[self close];

return rc;

}

上面函數(shù)中sqlite3_free就是釋放存放錯誤信息的內(nèi)存空間漆羔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梧奢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子演痒,更是在濱河造成了極大的恐慌亲轨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸟顺,死亡現(xiàn)場離奇詭異惦蚊,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門蹦锋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兆沙,“玉大人,你說我怎么就攤上這事晕粪〖废ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵巫湘,是天一觀的道長装悲。 經(jīng)常有香客問我,道長尚氛,這世上最難降的妖魔是什么诀诊? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮阅嘶,結(jié)果婚禮上属瓣,老公的妹妹穿的比我還像新娘。我一直安慰自己讯柔,他們只是感情好抡蛙,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魂迄,像睡著了一般粗截。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捣炬,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天熊昌,我揣著相機與錄音,去河邊找鬼湿酸。 笑死婿屹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的推溃。 我是一名探鬼主播昂利,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼美莫!你這毒婦竟也來了页眯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厢呵,失蹤者是張志新(化名)和其女友劉穎窝撵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體襟铭,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡碌奉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年短曾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赐劣。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫉拐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魁兼,到底是詐尸還是另有隱情婉徘,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布咐汞,位于F島的核電站盖呼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏化撕。R本人自食惡果不足惜几晤,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望植阴。 院中可真熱鬧蟹瘾,春花似錦、人聲如沸掠手。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喷鸽。三九已至伊脓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魁衙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工株搔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剖淀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓纤房,卻偏偏與公主長得像纵隔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炮姨,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容