=具體的文檔可以參照官方說明FMDB github,這裏只是日常一些操作的說明
需要注意的是,直接使用 FMDatabase 實例時要考慮線程安全的問題,FMDatabaseQueue 可以直接跨線程使用,並且支持事務操作
創建表
CREATE TABLE IF NOT EXISTS %@ (_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \
sender TEXT, \
current_user_uri TEXT NOT NULL, \
type INTEGER, \
date INTEGER NOT NULL, \
content TEXT, \
action TEXT, \
icon_key TEXT, \
is_read INTEGER, \
url TEXT, \
image_url TEXT, \
sender_avatar_url TEXT, \
title TEXT UNIQUE, \
msgid INTEGER\
)
刪除表
DROP TABLE %@
增
INSERT INTO tableName(title,age) VALUES('title',2)
// 參數可以調用對應的方法以字典的形式傳
INSERT INTO tableName(title, age) VALUES(?,?)
刪
DELETE FROM t_student WHERE age < 50 AND name NOT NULL;
// 刪除表中所有數據
DELETE FROM t_student
一般,如果食用了自增 id,SQLite 會自動生成 sqlite_sequence 表,用於記錄當前自增 id 值。所以清除表中內容時,可以這個表中內容可以一起清除
DELETE FROM t_student
UPDATE sqlite_sequence set seq=0 where name=t_student
改
UPDATE t_student SET name='NNMM' WHERE age<50 AND score>10;
UPDATE t_student SET name=?,address=? WHERE age<50 AND score>10
查
/*分頁*/
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;
/*計量*/
// 後面的 as 是爲了方便從 FMResultSet 獲取查詢到的結果數量 “count” 是列名稱
SELECT COUNT(*) as count FROM t_student WHERE age>50;
// 獲取表中有多少個不同的 “name”
SELECT COUNT(DISTINCT name) FROM t_student
/*別名*/
SELECT name as myName, age as myAge, score as myScore FROM t_student;
SELECT name myName, age myAge, score myScore FROM t_student;
SELECT name, age, score FROM t_student;
SELECT * FROM t_student;
視圖(View)
NSString *sql = @"CREATE VIEW IF NOT EXISTS all_info AS SELECT \
student._id as data_id,\
student.stu_id,\
name,\
// 這個字段屬於 student_score 表,因爲需要在 view 中有,所以這裏要寫上,student_score 中其他字段的值沒有寫在這裏,所以 view 中不會有
score \
FROM student \
LEFT OUTER JOIN student_score ON student.stu_id=student_score.stu_id;";
現有如下兩個表
Employee Table
EmpName | DepartmentID |
---|---|
Rafferty | 31 |
Jones | 33 |
Steinberg | 33 |
Robinson | 34 |
Smith | 34 |
Jasper | NULL |
Department Table
DepartmentID | DeptName |
---|---|
31 | Sales |
33 | Engineering |
34 | Clerical |
35 | Marketing |
inner join
SELECT * FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID
上面的內容等同於
SELECT * FROM employee, department WHERE employee.DepartmentID = department.DepartmentID
outer join
包含:
- 左外連接(Left outer Join or Left Join)
- 右外連接(Right outer join or Right Join)
- 全外連接(Full outer Join)
// 如果這裏不是 * 則結果中包含的列就是指定的列
// 如果 * 替換爲 EmpName,DepartmentID,DepartmentName,則下面的結果中就會少一列 Department.DepartmentID
SELECT * FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID
Employee.EmpName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Jones | 33 | Engineering | 33 |
Rafferty | 31 | Sales | 31 |
Robinson | 34 | Clerical | 34 |
Smith | 34 | Clerical | 34 |
Jasper | NULL | NULL | NULL |
Steinberg | 33 | Engineering | 33 |
SELECT *
FROM employee RIGHT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID
Employee.EmpName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Smith | 34 | Clerical | 34 |
Jones | 33 | Engineering | 33 |
Robinson | 34 | Clerical | 34 |
Steinberg | 33 | Engineering | 33 |
Rafferty | 31 | Sales | 31 |
NULL | NULL | Marketing | 35 |
SELECT * FROM employee FULL OUTER JOIN department ON employee.DepartmentID = department.DepartmentID
Employee.EmpName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Smith | 34 | Clerical | 34 |
Jones | 33 | Engineering | 33 |
Robinson | 34 | Clerical | 34 |
Jasper | NULL | NULL | NULL |
Steinberg | 33 | Engineering | 33 |
Rafferty | 31 | Sales | 31 |
NULL | NULL | Marketing | 35 |
觸發器(trigger)
各式一:
CREATE TRIGGER IF NOT EXISTS triggerName <AFTER|BEFORE> <UPDATE|DELETE|INSERT> ON tableName
BEGIN
// DO SOMETHING
END;
各式二:
CREATE TRIGGER triggerName <AFTER|BEFORE> <UPDATE|DELETE|INSERT> OF colName ON tableName WHEN judgeMent
BEGIN
// DO SOMETHING
END;
示例
// new 代表新值,old 代表原有的值
CREATE TRIGGER update_items_order BEFORE UPDATE OF ordering ON items WHEN new.ordering == old.ordering AND 0 == (SELECT value FROM dbinfo WHERE key='ignore_items_update_triggers')
BEGIN
UPDATE dbinfo SET value=1 WHERE key='ignore_items_update_triggers';
UPDATE items SET ordering = ordering - 1 WHERE parent_id = old.parent_id AND ordering BETWEEN old.ordering and new.ordering;
UPDATE dbinfo SET value=0 WHERE key='ignore_items_update_triggers';
END;
CREATE OR REPLACE TRIGGER biud_employee_copy BEFORE INSERT OR UPDATE OR DELETE ON employees_copy
BEGIN
INSERT INTO employees_log( Who,when) VALUES(user, sysdate);
END;
CREATE TRIGGER app_inserted AFTER INSERT ON items WHEN new.type = 4 OR new.type = 5
BEGIN
INSERT INTO image_cache VALUES (new.rowid,0,0,NULL,NULL);
END;
CREATE TRIGGER item_deleted AFTER DELETE ON items
BEGIN
DELETE FROM apps WHERE rowid=old.rowid;
DELETE FROM groups WHERE item_id=old.rowid;
DELETE FROM widgets WHERE rowid=old.rowid;
DELETE FROM downloading_apps WHERE item_id=old.rowid;
UPDATE dbinfo SET value=1 WHERE key='ignore_items_update_triggers';
UPDATE items SET ordering = ordering - 1 WHERE old.parent_id = parent_id AND ordering > old.ordering;
UPDATE dbinfo SET value=0 WHERE key='ignore_items_update_triggers';
END;