數(shù)據(jù)庫SQLite以及FMDB的使用

SQLite函數(shù)總結(jié)

1.打開數(shù)據(jù)庫

int sqlite3_open(

const char *filename,? // 數(shù)據(jù)庫的文件路徑

sqlite3 **ppDb? ? ? ? ? // 數(shù)據(jù)庫實(shí)例

);

2.執(zhí)行任何SQL語句

int sqlite3_exec(

sqlite3*,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 一個(gè)打開的數(shù)據(jù)庫實(shí)例

const char *sql,? ? ? ? ? ? ? ? ? ? ? ? ? // 需要執(zhí)行的SQL語句

int (*callback)(void*,int,char**,char**),? // SQL語句執(zhí)行完畢后的回調(diào)

void *,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 回調(diào)函數(shù)的第1個(gè)參數(shù)

char **errmsg? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 錯(cuò)誤信息

);

3.檢查SQL語句的合法性(查詢前的準(zhǔn)備)

int sqlite3_prepare_v2(

sqlite3 *db,? ? ? ? ? ? // 數(shù)據(jù)庫實(shí)例

const char *zSql,? ? ? // 需要檢查的SQL語句

int nByte,? ? ? ? ? ? ? // SQL語句的最大字節(jié)長度

sqlite3_stmt **ppStmt,? // sqlite3_stmt實(shí)例,用來獲得數(shù)據(jù)庫數(shù)據(jù)

const char **pzTail

);

4.查詢一行數(shù)據(jù)

int sqlite3_step(sqlite3_stmt*); // 如果查詢到一行數(shù)據(jù)痰洒,就會(huì)返回SQLITE_ROW

5.利用stmt獲得某一字段的值(字段的下標(biāo)從0開始)

double sqlite3_column_double(sqlite3_stmt*, int iCol);? // 浮點(diǎn)數(shù)據(jù)

int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數(shù)據(jù)

sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型數(shù)據(jù)

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進(jìn)制文本數(shù)據(jù)

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);? // 字符串?dāng)?shù)據(jù)

SQLite最全的常用語句

/*簡(jiǎn)單約束*/

CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER);

CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL);

CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE, age INTEGER);

CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER DEFAULT 1);

/*分頁*/

SELECT * FROM t_student ORDER BY id ASC LIMIT 30, 10;

/*排序*/

SELECT * FROM t_student WHERE score > 50 ORDER BY age DESC;

SELECT * FROM t_student WHERE score < 50 ORDER BY age ASC , score DESC;

/*計(jì)量*/

SELECT COUNT(*) FROM t_student WHERE age > 50;

/*別名*/

SELECT name as myName, age as myAge, score as myScore FROM t_student;

SELECT name myName, age myAge, score myScore FROM t_student;

SELECT s.name myName, s.age myAge, s.score myScore FROM t_student s WHERE s.age > 50;

/*查詢*/

SELECT name, age, score FROM t_student;

SELECT * FROM t_student;

/*修改指定數(shù)據(jù)*/

UPDATE t_student SET name = 'MM' WHERE age = 10;

UPDATE t_student SET name = 'WW' WHERE age is 7;

UPDATE t_student SET name = 'XXOO' WHERE age < 20;

UPDATE t_student SET name = 'NNMM' WHERE age < 50 and score > 10;

/*刪除數(shù)據(jù)*/

DELETE FROM t_student;

/*更新數(shù)據(jù)*/

UPDATE t_student SET name = 'LNJ';

/*插入數(shù)據(jù)*/

INSERT INTO t_student(age, score, name) VALUES ('28', 100, 'jonathan');

INSERT INTO t_student(name, age) VALUES ('lee', '28');

INSERT INTO t_student(score) VALUES (100);

/*插入數(shù)據(jù)*/

INSERT INTO t_student(name, age, score) VALUES ('lee', '28', 100);

/*添加主鍵*/

CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, score REAL);

CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, score REAL);

CREATE TABLE IF NOT EXISTS t_student (id INTEGER, name TEXT, age INTEGER, score REAL, PRIMARY KEY(id));

/*刪除表*/

DROP TABLE t_student;

DROP TABLE IF EXISTS t_student;

/*創(chuàng)建表*/

CREATE TABLE t_student(id INTEGER , name TEXT, age , score REAL);

CREATE TABLE IF NOT EXISTS t_student(id INTEGER , name TEXT, age , score REAL);

FMDB

什么是FMDB

FMDB是iOS平臺(tái)的SQLite數(shù)據(jù)庫框架

FMDB以O(shè)C的方式封裝了SQLite的C語言API

FMDB的優(yōu)點(diǎn)

使用起來更加面向?qū)ο蠼グ纾∪チ撕芏嗦闊┙峋健⑷哂嗟腃語言代碼

對(duì)比蘋果自帶的CoreData框架创夜,更加輕量級(jí)和靈活

提供了多線程安全的數(shù)據(jù)庫操作方法稠屠,有效地防止數(shù)據(jù)混亂

FMDB的github地址

https://github.com/ccgus/fmdb

FMDB有三個(gè)主要的類

FMDatabase

一個(gè)FMDatabase對(duì)象就代表一個(gè)單獨(dú)的SQLite數(shù)據(jù)庫

用來執(zhí)行SQL語句

pFMResultSet

使用FMDatabase執(zhí)行查詢后的結(jié)果集

FMDatabaseQueue

用于在多線程中執(zhí)行多個(gè)查詢或更新斗忌,它是線程安全的

通過指定SQLite數(shù)據(jù)庫文件路徑來創(chuàng)建FMDatabase對(duì)象

FMDatabase *db = [FMDatabase databaseWithPath:path];

if (![db open]) {

NSLog(@"數(shù)據(jù)庫打開失斁醢 !");

}

文件路徑有三種情況

具體文件路徑

如果不存在會(huì)自動(dòng)創(chuàng)建

空字符串@""

會(huì)在臨時(shí)目錄創(chuàng)建一個(gè)空的數(shù)據(jù)庫

當(dāng)FMDatabase連接關(guān)閉時(shí)鲫骗,數(shù)據(jù)庫文件也被刪除

nil會(huì)創(chuàng)建一個(gè)內(nèi)存中臨時(shí)數(shù)據(jù)庫犬耻,當(dāng)FMDatabase連接關(guān)閉時(shí),數(shù)據(jù)庫會(huì)被銷毀

執(zhí)行更新

在FMDB中执泰,除查詢以外的所有操作香追,都稱為“更新”

create、drop坦胶、insert、update晴楔、delete等

使用executeUpdate:方法執(zhí)行更新

- (BOOL)executeUpdate:(NSString*)sql, ...

- (BOOL)executeUpdateWithFormat:(NSString*)format,

...

- (BOOL)executeUpdate:(NSString*)sqlwithArgumentsInArray:(NSArray*)arguments

示例

[db executeUpdate:@"UPDATE

t_student

SET age = ? WHERE name = ?;", @20, @"Jack"]

執(zhí)行查詢

查詢方法

- (FMResultSet*)executeQuery:(NSString*)sql, ...

- (FMResultSet*)executeQueryWithFormat:(NSString*)format,

...

- (FMResultSet*)executeQuery:(NSString*)sqlwithArgumentsInArray:(NSArray*)arguments

示例

// 查詢數(shù)據(jù)

FMResultSet *rs = [db executeQuery:@"SELECT

* FROM t_student"];

// 遍歷結(jié)果集

while ([rs next]) {

NSString*name = [rsstringForColumn:@"name"];

intage

= [rsintForColumn:@"age"];

doublescore = [rsdoubleForColumn:@"score"];

}

FMDatabase這個(gè)類是線程不安全的顿苇,如果在多個(gè)線程中同時(shí)使用一個(gè)FMDatabase實(shí)例,會(huì)造成數(shù)據(jù)混亂等問題

為了保證線程安全税弃,F(xiàn)MDB提供方便快捷的FMDatabaseQueue類

FMDatabaseQueue的創(chuàng)建

FMDatabaseQueue

*queue = [FMDatabaseQueue databaseQueueWithPath:path];

使用事務(wù)

[queue inTransaction:^(FMDatabase *db, BOOL

*rollback) {

[dbexecuteUpdate:@"INSERT

INTOt_student(name)

VALUES (?)",@"Jack"];

[dbexecuteUpdate:@"INSERT

INTOt_student(name)

VALUES (?)",@"Rose"];

[dbexecuteUpdate:@"INSERT

INTOt_student(name)

VALUES (?)",@"Jim"];

FMResultSet*rs= [dbexecuteQuery:@"select

* fromt_student"];

while([rsnext]) {

// …

}

}];

事務(wù)回滾

*rollback = YES;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纪岁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子则果,更是在濱河造成了極大的恐慌幔翰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件西壮,死亡現(xiàn)場(chǎng)離奇詭異遗增,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)款青,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門做修,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抡草,你說我怎么就攤上這事饰及。” “怎么了康震?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵燎含,是天一觀的道長。 經(jīng)常有香客問我腿短,道長屏箍,這世上最難降的妖魔是什么绘梦? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮铣除,結(jié)果婚禮上谚咬,老公的妹妹穿的比我還像新娘。我一直安慰自己尚粘,他們只是感情好择卦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著郎嫁,像睡著了一般秉继。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泽铛,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天尚辑,我揣著相機(jī)與錄音,去河邊找鬼盔腔。 笑死杠茬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弛随。 我是一名探鬼主播瓢喉,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼舀透!你這毒婦竟也來了栓票?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤愕够,失蹤者是張志新(化名)和其女友劉穎走贪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惑芭,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坠狡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遂跟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擦秽。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖漩勤,靈堂內(nèi)的尸體忽然破棺而出感挥,到底是詐尸還是另有隱情,我是刑警寧澤越败,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布触幼,位于F島的核電站,受9級(jí)特大地震影響究飞,放射性物質(zhì)發(fā)生泄漏置谦。R本人自食惡果不足惜堂鲤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媒峡。 院中可真熱鬧瘟栖,春花似錦、人聲如沸谅阿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽签餐。三九已至寓涨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氯檐,已是汗流浹背戒良。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冠摄,地道東北人糯崎。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像河泳,于是被迫代替她去往敵國和親拇颅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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