什么是數(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)存空間漆羔。