研究了一下osx下dock中应用的存储,位于~/Library/Application Support/Dock/下一个比較名字比較长的db文件里,之前简单的介绍过osx launchpad图标的删除,这里对db文件进行了分析。

osx中db文件是sqlite3数据库相应的数据库文件,学过andorid或者ios开发的朋友应该比較的熟悉,查看数据库能够看到该数据库(名字比較长的db文件)中存在一下表:

app_sources       dbinfo            image_cache       widgets         apps              downloading_apps 
items           categories        groups            widget_sources

当中比較重要的2个表要数apps与items表了,可是那个算是最主要的表呢,查看了一下表结构例如以下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49
sqlite> .schema apps

CREATE TABLE apps (item_id INTEGER PRIMARY KEY, title VARCHAR, bundleid VARCHAR, storeid VARCHAR,category_id INTEGER, moddate REAL,
bookmark BLOB);

sqlite> .schema items

CREATE TABLE items (rowid INTEGER PRIMARY KEY ASC, uuid VARCHAR, flags INTEGER, type INTEGER,
parent_id INTEGER NOT NULL, ordering INTEGER);

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 TRIGGER update_items_order_backwards 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 new.ordering and
old.ordering; UPDATE dbinfo SET value=0 WHERE key='ignore_items_update_triggers';
END; CREATE TRIGGER update_item_parent AFTER UPDATE OF parent_id ON items BEGIN UPDATE dbinfo SET value=1 WHERE key='ignore_items_update_triggers';
UPDATE items SET ordering = (SELECT ifnull(MAX(ordering),0)+1 FROM
items WHERE parent_id=new.parent_id AND ROWID!=old.rowid) WHERE ROWID=old.rowid;
UPDATE items SET ordering = ordering - 1 WHERE parent_id = old.parent_id and ordering >
old.ordering;

UPDATE dbinfo SET value=0 WHERE key='ignore_items_update_triggers';

END;

CREATE TRIGGER insert_item AFTER INSERT on items WHEN 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 = (SELECT ifnull(MAX(ordering),0)+1 FROM
items WHERE parent_id=new.parent_id) WHERE ROWID=new.rowid;

UPDATE dbinfo SET value=0 WHERE key='ignore_items_update_triggers';

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 widget_inserted AFTER INSERT ON items WHEN new.type = 6 OR new.type = 7

BEGIN

INSERT INTO image_cache VALUES (new.rowid,0,0,NULL,NULL);

END;

CREATE TRIGGER app_deleted AFTER DELETE ON items WHEN old.type = 4 OR old.type = 5

BEGIN

DELETE FROM image_cache WHERE item_id=old.rowid;

END;

CREATE TRIGGER widget_deleted AFTER DELETE ON items WHEN old.type = 6 OR old.type = 7

BEGIN

DELETE FROM image_cache WHERE item_id=old.rowid;

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;

CREATE INDEX items_uuid_index ON items (uuid);

CREATE INDEX items_ordering_index ON items (parent_id,ordering);

CREATE INDEX items_type ON items (type);

sqlite>

从上面能够看出items相应了非常多的触发器,所以items应该是基表。说到了触发器,以下開始说我们的正题。

当数据库中表中的数据发生变化时,包含insert,update,delete随意操作,假设我们对该表写了相应的DML触发器,那么该触发器自己主动运行。DML触发器的主要作用在于强制运行业 务规则,以及扩展Sql Server约束,默认值等。由于我们知道约束仅仅能约束同一个表中的数据,而触发器中则能够运行随意Sql命令。

以下从一个样例来介绍一下触发器的使用。数据库中有3个表,src、backup、del,分表代表原数据表,备份数据表和删除数据表,我们如今要实现的是对原数据的插入与更新以及删除要同步到backup表中,对原数据的删除,要将删除的信息写入del表中,也就是要保证src表与backup表是时刻一模一样的,del表存储删除的信息。

触发器的创建例如以下:

1

2

3

4

5

6
CREATE TRIGGER < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >

ON <tableName> //dbo代表该表的全部者

FOR EACH ROW

BEGIN

--do something

END ;

三个表都很的简单,仅仅有一个int类型的id属性。创建表以及触发器例如以下:

1

2

3

4

5

6
CREATE TABLE src(id int);

CREATE TABLE backup(id int);

CREATE TABLE del(id int);

CREATE TRIGGER trigger1 after insert on src begin insert into backup values(new.id);
end;

CREATE TRIGGER trigger2 after update on src begin update backup set id=new.id
where id=old.id ; end;

CREATE TRIGGER trigger3 after delete on src begin insert into del values(old.id) ;
delete from backup where id=old.id; end;

上面的3个触发器的意思还是非常easy理解的,我们须要注意的一点是在begin与end之间的操作中,对前面作用表的新旧数据使用new和old进行指向,如在src表进行插入操作后,会处罚trigger1,此时trigger将src中id的新值(new.id)插入带backup表中。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25
sqlite> insert into src values(1) ;
 //插入数据1

sqlite> insert into src values(2) ;
 //插入数据2

sqlite> select * from
src ;

1

2

sqlite> select * from
backup ;

1

2

sqlite> select * from
del ;

sqlite> update src set id=3 where id=2 ;
 //更新数据

sqlite> select * from
src ;

1

3

sqlite> select * from
backup ;

1

3

sqlite> select * from
del ;

sqlite> delete from src where id=1;
 //删除数据

sqlite> select * from
src ;

3

sqlite> select * from
backup ;

3

sqlite> select * from
del ;

1

sqlite>

能够看出,在src表发生更删改的时候,触发器启动了,运行了对应的操作,保证了数据的统一性。

很多其它文章请前往小胖轩.

sqlite3触发器的使用的更多相关文章

  1. Sqlite3 设置插入触发器

    需求: 数据库中表t_VerifyCsmDetail需要最多保存10W条记录,超出时删除最旧的那一条. 思路:设置插入触发器.插入前先判断表中记录总数,如果大于99999条,则删除最旧的一条记录. 代 ...

  2. SQLite源程序分析之sqlite3.c

    /****************************************************************************** ** This file is an a ...

  3. sqlite3 shell的使用

    sqlite的安装 1. 首先是下载sqlite,可以该页面下载:http://www.sqlite.org/download.html 当前的最新版本为:sqlite-shell-win32-x86 ...

  4. SQLITE3 使用总结

    转自: http://blog.chinaunix.net/uid-8447633-id-3321394.html 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总觉 ...

  5. sqlite3编程使用简介

    sqlite3使用范围 SQLite不同于其他大部分的SQL数据库引擎,因为它的首要设计目标就是简单化: 1.易于管理 2.易于使用 3.易于嵌入其他大型程序 4.易于维护和配置  许多人喜欢SQLi ...

  6. Ubuntu下sqlite3的安装及使用

    Sqlite是一款轻型的数据库,实现了多数SQL-92标准,包括事务(原子性,一致性,隔离性和持久性 ACID),触发器与多数复杂查询.对于一个移动手持设备的应用开发者,Sqlite是居家旅行必备数据 ...

  7. iOS sqlite3数据库解析

    看来从版本3.3.1基本上已经支持线程句柄的传递功能.具体限制我标记了一下.(6) Is SQLite threadsafe?SQLite is threadsafe. We make this co ...

  8. sqlite3 多线程和锁 ,优化插入速度及性能优化

    一. 是否支持多线程?   SQLite官网上的"Is SQLite threadsafe?"这个问答. 简单来说,从3.3.1版本开始,它就是线程安全的了.而iOS的SQLite ...

  9. sqlite3使用入门

    sqlite的安装 1. 首先是下载sqlite,可以该页面下载:http://www.sqlite.org/download.html 当前的最新版本为:sqlite-shell-win32-x86 ...

随机推荐

  1. 在html中写python代码的语法和特点-----基于webpy的httpserver

    在html文件里写python语法的内容,的注意事项: 1:python程序中的变量通过以下方法传入到html: 1:通过全局变量 :全局变量是不须要用$def with语法实现传递的,仅仅要定义了 ...

  2. HDU 4643 GSM 简单计算几何

    今天比赛的时候略坑, admin告诉我询问Q的个数不超过n^2, 赛后敲了个 O(Q*m^3)的复杂度,但这个复杂度常数比较低,可能在除以个小常数, 300ms过了,真心无语,数据应该水了吧,比赛的时 ...

  3. linux centos 卸载jdk

    1.先看看OpenJDK的安装包 $ rpm -qa |grep java tzdata-java-2013b-1.el6.noarch java-1.6.0-openjdk-1.6.0.0-1.61 ...

  4. sleep和wait的区别

    sleep指线程被调用时,占着CPU不工作,形象地说明为“占着CPU睡觉”,此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制.wait指线程处于进入等待状态,形象地说明为“等待使用C ...

  5. PHP:小数位计算

    本文提供了两种方法,分数的方法成为字符串.然后,"."为了拦截.跟.子长后.另一个是关于小数*10的N钍.实例10的8再次钍8取余次.然后继续10余.取决于10结果的余数是不0. ...

  6. Linux cp -a用法

    对于cp -a最主要的用法是在保留原文件属性的前提下复制文件.其实还有个很好的用法,如下: 大家知道linux下复制目录可以通过,cp -r dirname destdir 但是这样复制的目录属性会发 ...

  7. 经常使用的正則表達式归纳—JavaScript正則表達式

    来源:http://www.ido321.com/856.html 1.正则优先级 首先看一下正則表達式的优先级,下表从最高优先级到最低优先级列出各种正則表達式操作符的优先权顺序: 2.经常使用的正則 ...

  8. 官方原版Windows XP SP3(VOL)中文简体版ISO下载

    今天,向各位朋友推荐今年五月,由MSDN官方集成的XP With SP3专业VOL版.    文 件:Windows XP Professional with Service Pack 3 (x86) ...

  9. Linux内核——定时器和时间管理

    定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...

  10. ECLIPSE JSP TOMCAT 环境搭建

    ECLIPSE JSP TOMCAT 环境搭建(完整) 要学习一门语言,首先要做的就是搭建环境,然后能写一个小的Demo(类似Helloworld),不仅可以建立信心,而且还可以为之后的学习搭建一个验 ...