iOS基礎 - 數據庫-SQLite

1、iOS應用數據存取的經常使用方式

XML屬性列表 —— PList程序員

NSKeyedArchiver 歸檔sql

Preference(偏好設置)數據庫

SQLite3 編程

Core Data(以面向對象的方式操做數據庫SQLite數據結構

2、數據庫簡介(文件)

數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫spa

數據庫的種類:設計

關係型數據庫(主流)excel

對象型數據庫sqlite

文檔型數據庫(Lotus Notes對象

主流數據庫

PC端:DB2OracleSybaseMySQLSQLServer

嵌入式\客戶端:SQLite

3、數據庫的基本概念

數據庫的存儲結構跟excel相似

表(table

記錄(row),每行都有不少個字段

字段(column

SQL語句

SQLstructured query language):結構化查詢語言,一種對關係數據庫中的數據進行定義和操做的句法

要操做和訪問數據庫中存儲的數據,必須編寫SQL語句

SQL語句是不區分大小寫的(即大小寫同樣)

SQL語句都以分號;結尾

4、SQL語句

數據定義語言(DDLData Definition Language

其語句包括動詞CREATEDROP

在數據庫中建立新表或刪除表(CREAT TABLE 或 DROP TABLE

數據操做語言(DMLData Manipulation Language

其語句包括INSERTUPDATEDELETE,它們分別用於添加,修改和刪除表中的行

也稱爲動做查詢語言

數據查詢語言(DQLData Query Language

也稱爲「數據檢索語句」,用以從表中得到數據

保留字SELECTDQL(也是全部SQL)用得最多的動詞,其餘DQL經常使用的保留字有WHEREORDER BYGROUP BYHAVING

5、DDL語句

創表

CREATE TABLE 表名 (字段名字段類型1, 字段名字段類型2, );

CREATE TABLE IF NOT EXISTS 表名 (字段名字段類型1, 字段名字段類型2, );

示例:

CREATE TABLE IF NOT EXISTS T_Person (id INTEGER, name TEXT, gender INTEGER, age INTEGER, height REAL);

刪表

DROP TABLE 表名;

示例:

DROP TABLE T_Person;

6、字段類型

SQLite將數據值的存儲劃分爲如下幾種存儲類型:

NULL: 表示該值爲NULL

INTEGER: 無符號整型值

REAL: 浮點值

TEXT: 文本字符串

BLOB: 二進制數據(好比文件)

實際上SQLite是無類型的,建表時聲明或不聲明類型均可以,也就意味着創表語句能夠這麼寫:

create table t_student(name, age);

注意:爲了保持良好的編程規範,方便程序員之間的交流,編寫建表語句的時候最好加上每一個字段的具體類型

7、DML語句

插入數據(INSERT

INSERT INTO 表名(字段1, 字段2, ) VALUES (字段1的值字段2的值);

示例:

INSERT INTO T_Person (name, age) VALUES ('張三', 18);

注意:數據庫中的字符串內容應該用單引號’括住

更新數據(UPDATE

UPDATE 表名 SET 字段1 = 字段1的值字段2 = 字段2的值… 

示例:

UPDATE T_Person SET name = '李四', age = 20;

注意:這裏會將T_Person表中全部記錄的name都改成李四,age都改成20

刪除數據(DELETE

DELETE FROM 表名;

示例:

DELETE FROM T_Person;

注意:這裏會將T_Person表中全部記錄都刪掉

8、條件語句

若是隻想更新或者刪除某些固定的記錄,就須要在DML語句後加上一些條件

條件語句的格式以下:

WHERE 字段 某個值 AND 字段 某個值;  

WHERE 字段 某個值 OR 字段 某個值;   

示例

將年齡大於10而且姓名不等於jack的記錄年齡都改成5

UPDATE T_Person SET age = 5 WHERE age > 10 AND name != ‘張三’;

刪除年齡小於等於10或者年齡大於30的記錄

DELETE FROM T_Person WHERE age < 10 OR age > 30;

9、DQL語句

DQL語句就是查詢語句,格式以下:

SELECT 字段1, 字段2, … FROM 表名;

SELECT name, age FROM T_Person;

若是想查詢全部的字段能夠用:

SELECT * FROM 表名;

SELECT * FROM T_Person;

也能夠添加條件語句

SELECT * FROM T_Person WHERE age > 10;

計算記錄的數量能夠用count(字段)或者count(*)

SELECT count(*) FROM T_Person;

SELECT count(*) FROM T_Person WHERE height < 1.68;

10、排序

查詢出來的結果能夠用order by進行排序

SELECT * FROM T_Person ORDER BY 字段;

SELECT * FROM T_Person ORDER BY age;

默認是按照升序排序(由小到大),也能夠變爲降序(由大到小)

SELECT * FROM T_Person ORDER BY age DESC; // 降序

SELECT * FROM T_Person ORDER BY age ASC;  // 升序(默認)

也能夠用多個字段進行排序

SELECT * FROM T_Person ORDER BY age ASC, height DESC;

先按照年齡排序(升序),年齡相等就按照身高排序(降序)

11、限制查詢數量

SELECT * FROM 表名 LIMIT 數值1, 數值2;

SELECT * FROM T_Person LIMIT 4, 8;

上面的語句,能夠這麼理解:

跳過最前面4條語句,而後取8條記錄

LIMIT經常使用來作分頁查詢,好比每頁固定顯示6條數據,那麼每一頁應該這樣取數據:

1頁:LIMIT 0, 6

2頁:LIMIT 6, 6

3頁:LIMIT 12, 6

n頁:LIMIT 6*(n-1), 6

SELECT * FROM T_Person LIMIT 5;

表示取最前面的5條記錄

12、簡單約束

建表的時候能夠給特定的字段 設置 一些約束條件

NOT NULL指定字段的值不能爲null

UNIQUE指定字段的值必須惟一

DEFAULT指定字段的默認值

CREATE TABLE T_Student (id INTEGER, name TEXT NOT NULL UNIQUE, age INTEGER NOT NULL DEFAULT 1);

name字段不能爲NULL,而且惟一

age字段不能爲NULL,而且默認爲1

十3、主鍵約束(PK)

T_Person中有些記錄的name屬性和age屬性都同樣時,將沒法區分這些數據,形成數據庫的記錄不惟一,這樣不方便管理數據

良好的數據庫編程規範應該是要保證每條記錄的惟一性,爲此,增長了主鍵約束

主鍵是用來惟一地標識某一條記錄的,能夠是一個字段或多個字段

好比T_Person能夠增長一個id字段做爲主鍵,至關於人的身份證

主鍵的設計原則:

主鍵應當是對用戶沒有意義的

永遠也不要更新主鍵,讓數據庫自動維護

主鍵不該包含動態變化的數據

主鍵應當由計算機自動生成

主鍵目的:惟一標示一條記錄

在須要時,讓數據庫告訴咱們主鍵是多少

主鍵一般採用自動增長的整數來定義!

SELECT * FROM T_Student LEFT JOIN T_BOOK

LEFT JOIN 就是以左邊的數據爲主,右邊的數據爲輔助,會將左邊的數據所有顯示出來,右邊沒有數據的顯示爲NULL,左邊爲主的關係!

JOIN 只查詢兩個表之間共有的數據!在開發中JION用得少,並且容易「丟(有些右邊沒有數據的記錄不會顯示)」數據,JOIN是平等關係

十4、主鍵約束

在創表的時候用PRIMARY KEY聲明一個主鍵

CREATE TABLE T_Student (id integer PRIMARY KEY,name text,age integer);

只要聲明爲PRIMARY KEY,就說明是一個主鍵字段,主鍵字段默認就包含了NOT NULLUNIQUE兩個約束

若是想要讓主鍵自動增加(integer類型),應該增長AUTOINCREMENT

CREATE TABLE T_Student (id integer PRIMARY KEY AUTOINCREMENT, name text, age integer);

十5、外鍵約束(FK)

外鍵約束能夠用來創建表與表之間的聯繫

新建一個外鍵

CREATE TABLE T_Student (

 id INTEGER PRIMARY KEY AUTOINCREMENT,

 name TEXT NOT NULL,

 age INTEGER NOT NULL DEFAULT 1,

 book_id INTEGER,

FOREIGN KEY (book_id) REFERENCES T_Book (id) ON DELETE SET NULL,

UNIQUE ("name" ASC)

)

T_Student表中有一個外鍵book_id引用着T_Book的主鍵id

十6、錶鏈接查詢

查詢擁有《如來神掌》這本書的全部學生

SELECT s.name, s.age, b.name bookName 

FROM T_Student s

JOIN T_Book b ON b.id = s.book_id;

WHERE b.name = ‘如來神掌';

JOINON用來創建兩個表之間的關聯關係

十7、SQLite3

SQLite3是一款開源的嵌入式關係型數據庫,可移植性好、易使用、內存開銷小

SQLite3是無類型的,意味着能夠保存任何類型的數據到任意表的任意字段中。好比下列的創表語句是合法的:

CREATE TABLE T_Person(name, age);

爲了保證可讀性,建議仍是把字段類型加上:

CREATE TABLE T_Person(name text, age integer);

SQLite3經常使用的5種數據類型:textintegerfloatbooleanblob(大量的文本或者圖像)

iOS中要使用SQLite3,須要添加庫文件:libsqlite3.dylib並導入主頭文件,這是一個C語言的庫

十8、應用程序中SQLite3相關的操做

建立數據庫(sqlite3_opendb

單步執行操做(sqlite3_exec

建立數據表

數據操做

插入數據

更新數據

刪除數據

查詢操做

sqlite3_prepare_v2檢查sql的合法性

sqlite3_step逐行獲取查詢結果

sqlite3_coloum_xxx獲取對應類型的內容

sqlite3_finalize釋放stmt

相關文章
相關標籤/搜索