研究了一下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. [ACM] hdu 4418 Time travel (高斯消元求期望)

    Time travel Problem Description Agent K is one of the greatest agents in a secret organization calle ...

  2. Mysql怎样删除以“#sql-”开头的暂时表

    author:skate time:2014/09/28 Mysql怎样删除以"#sql-"开头的暂时表 现象:在重建索引后,发现Mysqlserver的磁盘空间快满了 在用例如以 ...

  3. 我的Android学习之旅(转)

    去年大概在七月份的时候误打误撞接触了一阵子Android,之后由于工作时间比较忙,无暇顾及,九月份的时候自己空闲的时间比较多,公司相对来说加班情况没以前严重.开启了个人的Android学习之旅,初衷是 ...

  4. android &quot;Missing type parameter&quot; 错误

    近期在做android应该的时候出现这个问题,分析了一下日志,发现是在gosn解析的时候会出现,并且出现的时候非常诡异.于是去网上找相关资料. 发现这个问题还是比較常见的,原来是公布版本号和非正式公布 ...

  5. ubuntu 12.10 软件更新源列表

    ubuntu 12.10正式版已经发布了,国内各大开源软件源也陆续更新了资源.今天分享一下ubuntu 12.10 软件更新源列表. 首先,习惯性的备份一下ubuntu 12.04 原来的源地址列表文 ...

  6. 六:Java之集合

    集合包括的内容非常多,我发现一个非常好的博客,感觉自己都没有写的必要了! 链接献上  Java集合

  7. 在web浏览器中判断app是否安装并直接打开

    最近公司App产品在运营推广上有一个需求,就是要求可以让用户在访问我们的推广网页时,就可以判断出这个用户手机上是否安装了我们的App,如果安装了则可以直接在网页上打开,否则就引导用户前往下载.从而形成 ...

  8. swfobject.js的简单配置

    因为工作需要在网页中迁入flash,开发过程中,发现直接使用embed自己开发的话需要考虑各种兼容性,也比较麻烦, 网上也找了几个相关的插件,比较使用之下,发现swfobject.js这一款还是蛮不错 ...

  9. Linux如何查找大文件或目录总结及在全部目录中查找

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  10. PHP类中的七种语法说明

    类中的七种语法说明 -属性 -静态属性 -方法 -静态方法 -类常量 -构造函数 -析构函数 <?php class Student { // 类里的属性.方法和函数的訪问权限有 (函数和方法是 ...