FMDB 常用操作整理

=具體的文檔可以參照官方說明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 &gt; old.ordering;
UPDATE dbinfo SET value=0 WHERE key='ignore_items_update_triggers';
END;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章