iOS應用數據持久化(二)之SQLite3

一、數據庫是什么?

SQL語言簡潔,語法簡單,易學易用
SQL(structured query language):是一種結構化查詢語言
SQL是一種對關系型數據庫中的數據進行定義和操作的語言

二、SQLite 數據庫是什么?

SQLite百科

SQLite百科介紹

三、SQL語句的種類

*1. DDL(Data Definition Language) - 數據定義語句

| 命令 |描述 |
| ------------- |:------------- -----:|
|CREATE | 創建一個新的表,一個表的視圖,或者數據庫中的其他對象 |
| ALTER | 修改數據庫中的某個已有的數據庫對象,比如一個表 |
| DROP | 刪除整個表,或者表的視圖,或者數據庫中的其他對象 |

*2. DML(Data Manipulation Language) - 數據操作語句

| 命令 |描述 |
| ------------- |:------------- -----:|
|INSERT |新增數據 |
| UPDATE | 修改數據庫中的某個已有的數據庫對象,比如一個表 |
|DELETE | 刪除整個表,或者表的視圖,或者數據庫中的其他對象 |

*3. DQL(Data Query Language) - 數據查詢語句

| 命令 |描述 |
| ------------- |:------------- -----:|
|SELECT |查詢數據 |

四、條件語句的介紹

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

1.WHERE

| WHERE |判斷 | 注釋|
| ------------- |:------------- -----:|
|where |字段 = 某個值 | 不能用==(兩個等號) |
|where |字段 is 某個值 |is 相當于 = |
|where |字段 != 某個值 |~|
|where |字段 is not 某個值 |is not 相當于 != |
|where |字段 > 某個值|~|
|where |字段1 = 某個值 and 字段2 > 某個值 |and相當于C語言中的 && |

另外:
where    字段1 = 某個值 or 字段2 = 某個值    //or 相當于C語言中的 ||
示例
將t_zorn表中姓名等于zorn 并且電話不等于110的記錄
update t_zorn set name = 'zorn' where number != 110 ;```
####2.LIKE
| 語句        |描述 |
| ------------- |:------------- -----:|
|WHERE number LIKE '110%'     | 查找以110開頭的任意值 |
| WHERE number LIKE '%110%'      | 查找任意位置包含110的任意值 |
|WHERE number LIKE '_10%' |查找第二位和第三位為10的任意值|
|WHERE number LIKE '0_%_%'     | 查找以0開頭,且長度至少為3個字符的任意值 |
| WHERE number LIKE '%112'      |查找以112結尾的任意值 |
|WHERE number LIKE '_1%2' |查找第二位為1,且以2結尾的任意值|
|WHERE number LIKE '2__3' |查找長度為5位數,且以2開頭以3結尾的任意值|

注意:??
%是轉義字符,兩個%才表示一個%```

3.LIMIT

使用limit可以精確地控制查詢結果的數量,比如每次只查詢10條數據
格式
select * from 表名 limit 數值1, 數值2 ;
示例
select * from t_zorn limit 4, 8 ;

可以理解為:跳過最前面4條語句,然后取8條記錄
limit常用來做分頁查詢,比如每頁固定顯示5條數據,那么應該這樣取數據

| 頁數 |LIMIT | 數值|
| ------------- |:------------- -----:|
|第1頁 |limit | 0, 5 |
|第2頁 |limit |5, 5 |
|第3頁 |limit |10, 5|
|... || |
|第n頁 |limit|5*(n-1), 5|

select * from t_zorn limit 7 ;這條語句的作用相當于select * from t_student limit 0, 7 ;表示取最前面的7條記錄

五、SQLite語法介紹

1)SQLite將數據劃分為以下幾種存儲類型:
integer      整型值,根據值的大小存儲在 1、2、3、4、6 或 8 字節中。
real               浮點值,存儲為 8 字節的 IEEE 浮點數字。
text                文本字符串,使用數據庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)存儲。
blob              二進制數據,根據它的輸入存儲。```

注意:實際上SQLite是無類型的,就算聲明為integer類型,還是能存儲字符串文本(主鍵除外)
建表時聲明啥類型或者不聲明類型都可以,也就意味著創表語句可以這么寫:
create table t_zorn(name, number);
提示:為了保持良好的編程規范、方便程序員之間的交流,編寫建表語句的時候最好加上每個字段的具體類型
 
#####2)**sqlite 的方法簡介**

sqlite3 *db, 數據庫的象征(句炳),跟文件句柄FILE很類似
sqlite3_open(), 打開數據庫,沒有數據庫時創建。
sqlite3_exec(), 執行非查詢的sql語句
Sqlite3_step(), 在調用sqlite3_prepare后,使用這個函數在記錄集中移動。
Sqlite3_close(), 關閉數據庫文件
sqlite3_stmt *stmt, 這個相當于ODBC的Command對象,用于保存編譯好的SQL語句
sqlite3_column_text(), 取text類型的數據。
sqlite3_column_blob(),取blob類型的數據
sqlite3_column_int(), 取int類型的數據```

3)SQLite語句
*1.打開數據庫
SQLITE_API int SQLITE_STDCALL sqlite3_open(
    const char *filename,   /* 數據庫文件路徑 (UTF-8) */
    sqlite3 **ppDb          /* 數據庫句炳(象征) */
    );

*2.執行任何SQL語句 (除了查詢語句)
SQLITE_API int SQLITE_STDCALL sqlite3_exec(
    sqlite3*,            /* 一個打開的數據庫實例 */
    const char *sql,     /* 需要執行的SQL語句 */
    int (*callback)(void*,int,char**,char**),  /* SQL語句執行完畢后的回調 */
    void *,              /* 回調函數的第1個參數 */
    char **errmsg        /* 錯誤信息(用來調試) */
          
*3.檢查SQL語句的合法性(查詢前的準備)
SQLITE_API int SQLITE_STDCALL sqlite3_prepare_v2(
    sqlite3 *db,            /* 數據庫實例 */
    const char *zSql,       /* 需要檢查的SQL語句, UTF-8 encoded */
    int nByte,              /* SQL語句的最大字節長度 */
    sqlite3_stmt **ppStmt,  /* OUT: sqlite3_stmt實例,用來獲得數據庫數據 */
    const char **pzTail     /* OUT: 指向 sql 語句中未使用的部分  */
);

*4.查詢一行數據
int sqlite3_step(sqlite3_stmt*); // 如果查詢到一行數據,就會返回SQLITE_ROW``
                                         
*5.利用stmt獲得某一字段的值(字段的下標從0開始)
 double sqlite3_column_double(sqlite3_stmt*, int iCol);             // 浮點數據
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);  // 字符串數據
int sqlite3_column_int(sqlite3_stmt*, int iCol);                    // 整型數據
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);        // 長整型數據
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);           // 二進制文本數據

六、基本操作

導入libsqlite3.tbd


libsqlite3-1.png

libsqlite3-2.png

1.創建表 (create)

格式
create table 表名;
create table if not exists 表名 ;
示例
create table t_zorn;
create table if not exists t_zorn;

2.插入數據(insert)

格式
insert into 表名 (字段1, 字段2, …) values (字段1的值, 字段2的值, …) ; 
示例
insert into t_student (name, number) values ('zorn', 123567) ; 
注意
數據庫中的字符串內容應該用單引號 ' 括住

3.刪表(drop)

格式
drop table 表名 ;
drop table if exists 表名 ;
示例
drop table t_zorn;
drop table if exists t_zorn ;
注意
上面的示例會將t_zorn表中所有記錄都刪掉 

4.指定位置刪除數據(delete)

格式
delete from 表名 where 字段1 = 1 ;
示例
delete from t_zorn where id = 1 ;

5.查詢數據(select)

格式
select 字段1, 字段2, … from 表名 ;
select * from 表名;   //  查詢所有的字段
示例
select name, age from t_zorn ;
select * from t_zorn ;
select * from t_zorn where number > 110 ;  //  條件查詢 ```

####6.更改數據(update)

格式
update 表名 set 字段1 = 字段1的值, 字段2 = 字段2的值, … ;
示例
update t_zorn set name = 'ren', numer = 112 ;
注意
上面的示例會將t_zorn表中所有記錄的name都改為ren,number都改為112 [可添加where(相當于if)做判斷]



###總結:
####SELECT的其它用法

*select還可以起別名(適用于字段和表)
格式
select 字段1 別名 , 字段2 別名 , … from 表名 別名 ;
select 字段1 別名, 字段2 as 別名, … from 表名 as 別名 ;
select 別名.字段1, 別名.字段2, … from 表名 別名 ;
示例
select name myname, number mynumber from t_zorn t_Ren;
給name起個叫做myname的別名,給number起個叫做mynumber的別名,給t_zorn起個叫做t_Ren的別名
select w.name, w.number from t_student s ;
給t_zorn表起個別名叫做w,利用s來引用表中的字段

*select計算記錄的數量
格式
select count (字段) from 表名 ;
select count ( * ) from 表名 ;
示例
select count (number) from t_zron ;
select count ( * ) from t_zorn where number = 110;

*select排序
查詢出來的結果可以用order by進行排序
select * from t_zorn order by 字段 ;
select * from t_zorn order by age ;
默認是按照升序排序(由小到大),也可以變為降序(由大到小)
select * from t_zorn order by age desc ; //降序
select * from t_zorn order by age asc ; // 升序(默認)
也可以用多個字段進行排序
select * from t_zorn order by age asc, height desc ;
先按照年齡排序(升序),年齡相等就按照身高排序(降序)```

附上SQLite管理工具下載地址(僅供參考):

SQLite Professional

->SQLite管理工具下載

實戰:

-> SQLite3Demo

運行時的主界面
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容