SQLite拱礁、FMDB

一、簡(jiǎn)介

1辕漂、什么是SQLite

SQLite是一款輕型的嵌入式數(shù)據(jù)庫

它占用資源非常的低呢灶,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了

它的處理速度比Mysql钉嘹、PostgreSQL這兩款著名的數(shù)據(jù)庫都還快

2鸯乃、什么是數(shù)據(jù)庫

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

3跋涣、數(shù)據(jù)庫可以分為2大種類

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

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

4缨睡、常用關(guān)系型數(shù)據(jù)庫

PC端:Oracle鸟悴、MySQL、SQL Server奖年、Access细诸、DB2、Sybase

嵌入式\移動(dòng)客戶端:SQLite

5陋守、Navicat 數(shù)據(jù)庫管理軟件

Navicat是一款著名的數(shù)據(jù)庫管理軟件震贵,支持大部分主流數(shù)據(jù)庫(包括SQLite)

6、數(shù)據(jù)庫的使用:

6.2.SQL 語句

如何在程序運(yùn)行過程中操作數(shù)據(jù)庫中的數(shù)據(jù)

那得先學(xué)會(huì)使用SQL語句

什么是SQL

SQL(structured query language):結(jié)構(gòu)化查詢語言

SQL是一種對(duì)關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行定義和操作的語言? ? - SQL語言簡(jiǎn)潔嗅义,語法簡(jiǎn)單屏歹,好學(xué)好用

什么是SQL語句

使用SQL語言編寫出來的句子\代碼,就是SQL語句

在程序運(yùn)行過程中之碗,要想操作(增刪改查蝙眶,CRUD)數(shù)據(jù)庫中的數(shù)據(jù),必須使用SQL語句

SQL語句的特點(diǎn)

不區(qū)分大小寫(比如數(shù)據(jù)庫認(rèn)為user和UsEr是一樣的)

每條語句都必須以分號(hào) ; 結(jié)尾

SQL中的常用關(guān)鍵字有

select褪那、insert幽纷、update、delete博敬、from友浸、create、where偏窝、desc收恢、order、by祭往、group伦意、table、alter硼补、view驮肉、index等

數(shù)據(jù)庫中不可以使用關(guān)鍵字來命名表、字段

SQL語句的種類

數(shù)據(jù)定義語句(DDL:Data Definition Language)

包括create和drop等操作

在數(shù)據(jù)庫中創(chuàng)建新表或刪除表(create table或drop table)

數(shù)據(jù)操作語句(DML:Data Manipulation Language)

包括insert已骇、update离钝、delete等操作

上面的3種操作分別用于添加、修改褪储、刪除表中的數(shù)據(jù)

數(shù)據(jù)查詢語句(DQL:Data Query Language)

可以用于查詢獲得表中的數(shù)據(jù)

關(guān)鍵字select是DQL(也是所有SQL)用得最多的操作

其他DQL常用的關(guān)鍵字有where卵渴,order by,group by和having

6.3.DDL

創(chuàng)表

格式

create table表名 (字段名1 字段類型1, 字段名2 字段類型2, …) ;

create table if not exists表名 (字段名1 字段類型1, 字段名2 字段類型2, …) ;

示例createtablet_student (idinteger,nametext, age inetger, scorereal) ;

字段類型

SQLite將數(shù)據(jù)劃分為以下幾種存儲(chǔ)類型:

integer: 整型值real : 浮點(diǎn)值text : 文本字符串blob : 二進(jìn)制數(shù)據(jù)(比如文件)

實(shí)際上SQLite是無類型的

就算聲明為integer類型鲤竹,還是能存儲(chǔ)字符串文本(主鍵除外)

建表時(shí)聲明啥類型或者不聲明類型都可以奖恰,也就意味著創(chuàng)表語句可以這么寫:

createtablet_student(name, age);

為了保持良好的編程規(guī)范、方便程序員之間的交流,編寫建表語句的時(shí)候最好加上每個(gè)字段的具體類型

刪表

格式

droptable表名 ;droptableifexists表名 ;示例droptablet_student ;

6.4.DML

插入數(shù)據(jù)(insert)

格式insertinto表名 (字段1, 字段2, …)values(字段1的值, 字段2的值, …) ;示例insertintot_student (name, age)values(‘mj’,10) ;注意? 數(shù)據(jù)庫中的字符串內(nèi)容應(yīng)該用單引號(hào) ’ 括住

更新數(shù)據(jù)庫(update)

格式? update 表名set字段1= 字段1的值, 字段2= 字段2的值, … ;? 示例? update t_studentsetname = ‘jack’, age =20;? 注意? 上面的示例會(huì)將t_student表中所有記錄的name都改為jack瑟啃,age都改為20

刪除數(shù)據(jù)(delete)

格式deletefrom表名 ;示例deletefromt_student ;注意? 上面的示例會(huì)將t_student表中所有記錄都刪掉

6.5.條件語句

如果只想更新或者刪除某些固定的記錄论泛,那就必須在DML語句后加上一些條件

條件語句的常見格式

where字段 = 某個(gè)值 ;// 不能用兩個(gè) =where字段is某個(gè)值 ;// is 相當(dāng)于 =where字段 != 某個(gè)值 ;where字段isnot 某個(gè)值 ;// is not 相當(dāng)于 !=where字段 > 某個(gè)值 ;where字段1= 某個(gè)值 and 字段2> 某個(gè)值 ;// and相當(dāng)于C語言中的 &&where字段1= 某個(gè)值 or 字段2= 某個(gè)值 ;//? or 相當(dāng)于C語言中的 ||

eg:

將t_student表中年齡大于10 并且 姓名不等于jack的記錄,年齡都改為 5updatet_studentsetage =5whereage >10andname!= ‘jack’ ;刪除t_student表中年齡小于等于10 或者 年齡大于30的記錄deletefromt_studentwhereage <=10orage >30;猜猜下面語句的作用updatet_studentsetscore = agewherename= ‘jack’ ;將t_student表中名字等于jack的記錄蛹屿,score字段的值 都改為 age字段的值

6.6.DQL

格式

select字段1, 字段2, …from表名 ;select*from表名;//? 查詢所有的字段

示例

selectname, agefromt_student ;select*fromt_student ;select*fromt_studentwhereage >10;//? 條件查詢

其別名

格式(字段和表都可以起別名)select 字段1別名 , 字段2別名 , …from表名 別名 ;select 字段1別名, 字段2as別名, …from表名as別名 ;select 別名.字段1, 別名.字段2, …from表名 別名 ;示例selectnamemyname, age myagefromt_student ;給name起個(gè)叫做myname的別名屁奏,給age起個(gè)叫做myage的別名select s.name, s.agefromt_student s ;給t_student表起個(gè)別名叫做s,利用s來引用表中的字

計(jì)算數(shù)量

格式selectcount(字段)from表名;selectcount(*)from表名;? 示例selectcount(age)fromt_student;selectcount(*)fromt_studentwherescore >=60;

6.7.排序

排序

查詢出來的結(jié)果可以用order by進(jìn)行排序select *fromt_studentorderby字段 ;select *fromt_studentorderbyage ;默認(rèn)是按照升序排序(由小到大)错负,也可以變?yōu)榻敌颍ㄓ纱蟮叫坟瓢。﹕elect *fromt_studentorderbyagedesc;//降序select *fromt_studentorderbyageasc;// 升序(默認(rèn))? 也可以用多個(gè)字段進(jìn)行排序select *fromt_studentorderbyageasc, heightdesc;先按照年齡排序(升序),年齡相等就按照身高排序(降序)

limit

使用limit可以精確地控制查詢結(jié)果的數(shù)量犹撒,比如每次只查詢10條數(shù)據(jù)? 格式? select * from 表名 limit 數(shù)值1, 數(shù)值2;? 示例? select * from t_student limit4,8;? 可以理解為:跳過最前面4條語句折联,然后取8條記錄

分頁查詢

limit常用來做分頁查詢,比如每頁固定顯示5條數(shù)據(jù)识颊,? ? ? 那么應(yīng)該這樣取數(shù)據(jù)? 第1頁:limit0,5第2頁:limit5,5第3頁:limit10,5…? 第n頁:limit5*(n-1),5猜猜下面語句的作用? select * from t_student limit7;? 相當(dāng)于select * from t_student limit0,7;? 表示取最前面的7條記錄

6.8.約束

簡(jiǎn)單約束

建表時(shí)可以給特定的字段設(shè)置一些約束條件诚镰,常見的約束? not null :規(guī)定字段的值不能為null? unique :規(guī)定字段的值必須唯一? default :指定字段的默認(rèn)值? (建議:盡量給字段設(shè)定嚴(yán)格的約束,以保證數(shù)據(jù)的規(guī)范性? 示例createtablet_student (idinteger,nametextnotnullunique, ageintegernotnulldefault1) ;name字段不能為null祥款,并且唯一? age字段不能為null清笨,并且默認(rèn)為1

主鍵約束

如果t_student表中就name和age兩個(gè)字段,而且有些記錄的name和age字段的值都一樣時(shí)刃跛,那么就沒法區(qū)分這些數(shù)據(jù)抠艾,造成數(shù)據(jù)庫的記錄不唯一,這樣就不方便管理數(shù)據(jù)

良好的數(shù)據(jù)庫編程規(guī)范應(yīng)該要保證每條記錄的唯一性桨昙,為此检号,增加了主鍵約束

也就是說,每張表都必須有一個(gè)主鍵蛙酪,用來標(biāo)識(shí)記錄的唯一

什么是主鍵

主鍵(Primary Key谨敛,簡(jiǎn)稱PK)用來唯一地標(biāo)識(shí)某一條記錄

例如t_student可以增加一個(gè)id字段作為主鍵,相當(dāng)于人的身份證

主鍵可以是一個(gè)字段或多個(gè)字段

主鍵的設(shè)計(jì)原則

主鍵應(yīng)當(dāng)是對(duì)用戶沒有意義的

永遠(yuǎn)也不要更新主鍵

主鍵不應(yīng)包含動(dòng)態(tài)變化的數(shù)據(jù)

主鍵應(yīng)當(dāng)由計(jì)算機(jī)自動(dòng)生成

主鍵的聲明

在創(chuàng)表的時(shí)候用primary key聲明一個(gè)主鍵

createtablet_student (idintegerprimarykey,nametext, ageinteger) ;integer類型的id作為t_student表的主鍵

主鍵字段

只要聲明為primary key滤否,就說明是一個(gè)主鍵字段

主鍵字段默認(rèn)就包含了not null和unique兩個(gè)約束

如果想要讓主鍵自動(dòng)增長(zhǎng)(必須是integer類型),應(yīng)該增加autoincrement

createtablet_student (idintegerprimarykeyautoincrement,nametext, ageinteger) ;

外鍵約束

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

外鍵的一般情況是:一張表的某個(gè)字段最仑,引用著另一張表的主鍵字段

新建一個(gè)外鍵createtablet_student (idintegerprimarykeyautoincrement,nametext, ageinteger, class_idinteger,constraintfk_student_class foreignkey(class_id)referencest_class (id));

t_student表中有一個(gè)叫做fk_t_student_class_id_t_class_id的外鍵

這個(gè)外鍵的作用是用t_student表中的class_id字段引用t_class表的id字段

表連接查詢

什么是表連接查詢:需要聯(lián)合多張表才能查到想要的數(shù)據(jù)

表連接的類型

內(nèi)連接:inner join 或者 join? (顯示的是左右表都有完整字段值的記錄)

左外連接:left outer join (保證左表數(shù)據(jù)的完整性)

示例查詢0316iOS班的所有學(xué)生select s.name,s.agefromt_student s, t_classcwheres.class_id =c.idandc.name= ‘0316iOS’;

文/Sunshine_Whboy(簡(jiǎn)書作者)

原文鏈接:http://www.reibang.com/p/fa753e380390

著作權(quán)歸作者所有藐俺,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書作者”泥彤。



iOS 開發(fā)中關(guān)于 FMDB 框架的使用:

FMDB的細(xì)節(jié)

1.數(shù)據(jù)庫是什么時(shí)候打開的欲芹?

在實(shí)例化queue時(shí)就打開了

2. FMDB操作多線程是如何實(shí)現(xiàn)的?

是使用GCD的串行對(duì)列來實(shí)現(xiàn)多線程處理的

3. FMDB的數(shù)據(jù)庫操作吟吝,F(xiàn)MDatabaseQueue默認(rèn)是在主線程上

4. FMDB的多線程操作方式:

串行隊(duì)列-保證隊(duì)列中的任務(wù)按照順序派發(fā)菱父,調(diào)度

同步任務(wù)-不會(huì)開啟線程,任務(wù)順序執(zhí)行

FMDB本質(zhì)上可以允許在后臺(tái)線程執(zhí)行數(shù)據(jù)操作,但是要求所有的數(shù)據(jù)操作浙宜,必須順序執(zhí)行官辽!

多線程:串行隊(duì)列,異步任務(wù)粟瞬,開啟一條線程同仆,所有任務(wù)順序執(zhí)行!

如果也要讓FMDB具有多線程功能裙品,需要自己開啟一個(gè)并發(fā)隊(duì)列俗批,讓所有數(shù)據(jù)操作由并發(fā)隊(duì)列調(diào)度

5.一定注意:在使用FMDB時(shí),一定不要嵌套任務(wù)使用市怎,否則會(huì)死鎖岁忘!本質(zhì)上是為了保證數(shù)據(jù)安全!


關(guān)于學(xué)習(xí)一個(gè)第三方框架:


1.要看官網(wǎng)的文檔

2.要看頭文件

3.要自己寫測(cè)試代碼区匠!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末干像,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辱志,更是在濱河造成了極大的恐慌蝠筑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揩懒,死亡現(xiàn)場(chǎng)離奇詭異什乙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)已球,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門臣镣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人智亮,你說我怎么就攤上這事忆某。” “怎么了阔蛉?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵弃舒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我状原,道長(zhǎng)聋呢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任颠区,我火速辦了婚禮削锰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毕莱。我一直安慰自己器贩,他們只是感情好颅夺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛹稍,像睡著了一般吧黄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稳摄,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天稚字,我揣著相機(jī)與錄音,去河邊找鬼厦酬。 笑死胆描,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仗阅。 我是一名探鬼主播昌讲,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼减噪!你這毒婦竟也來了短绸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤筹裕,失蹤者是張志新(化名)和其女友劉穎醋闭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朝卒,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡证逻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抗斤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚企。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瑞眼,靈堂內(nèi)的尸體忽然破棺而出龙宏,到底是詐尸還是另有隱情,我是刑警寧澤伤疙,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布银酗,位于F島的核電站,受9級(jí)特大地震影響徒像,放射性物質(zhì)發(fā)生泄漏黍特。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一厨姚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧键菱,春花似錦谬墙、人聲如沸今布。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽部默。三九已至,卻和暖如春造虎,著一層夾襖步出監(jiān)牢的瞬間傅蹂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工算凿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留份蝴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓氓轰,卻偏偏與公主長(zhǎng)得像婚夫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子署鸡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 1 - 什么是SQlite SQLite是一款輕型的嵌入式數(shù)據(jù)庫 SQLite數(shù)據(jù)庫:可以存儲(chǔ)大批量的數(shù)據(jù) 它占用...
    RadioWaves閱讀 364評(píng)論 0 0
  • SQLite基礎(chǔ) 1.簡(jiǎn)介 iOS數(shù)據(jù)數(shù)據(jù)存儲(chǔ)的方式Plist(NSArray\NSDictionary)Pref...
    小盒盒閱讀 743評(píng)論 1 11
  • iOS中的數(shù)據(jù)存儲(chǔ)方式 Plist(NSArray\NSDictionary) Preference(偏好設(shè)置\N...
    JonesCxy閱讀 642評(píng)論 0 3
  • 雪碧和可樂是一對(duì)好朋友靴庆。 雪碧還記得第一次在冰箱第一格遇見可樂的時(shí)候时捌,可樂是個(gè)還沒開口臉就先紅了的姑娘。 雪碧:她...
    西瓜姑娘愛分享閱讀 593評(píng)論 3 3
  • 上周在大連出差炉抒,從所住之處去星海廣場(chǎng)東邊的城堡酒店開會(huì)奢讨,那天早晨下著小雨,在路邊怎么也打不上車端礼,附近有一個(gè)...
    梁茂輝閱讀 334評(píng)論 0 1