研究了一下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. VSTO之旅系列(四):创建Word解决方案

    原文:VSTO之旅系列(四):创建Word解决方案 本专题概要 引言 Word对象模型 创建Word外接程序 小结 一.引言 在上一个专题中主要为大家介绍如何自定义我们的Excel 界面的,然而在这个 ...

  2. hdu2713(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2713 题意:有N个点,每个点都有一个值x,每次进行跳跃,当跳到自己所跳的第奇数个点是+x,第偶数个点时 ...

  3. linux管理员

    sudo password 添加管理员用户,设置其密码. exit 退出管理员.

  4. iOS7 文本转语音 AVSpeechSynthesizer

    OS7 的这个功能确实不错.我刚试了下,用官方提供的API ,简单的几句代码就能实现文本转语音! Xcode 5.0 工程建好后首先把AVFoundation.framework 加入到工程 AVSp ...

  5. 用java读写properties文件的代码

    package com.LY; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.F ...

  6. hdu4585 &amp; BestCoder Round #1 项目管理(vector应用)

    主题链接:pid=4858">http://acm.hdu.edu.cn/showproblem.php?pid=4858 项目管理 Time Limit: 2000/1000 MS ...

  7. slider使用TickPlacement获得游标效果

    <Slider Name="slider游标效果" Maximum="3" SmallChange="0.25" TickPlacem ...

  8. Windows Phone开发(25):启动器与选择器之WebBrowserTask

    原文:Windows Phone开发(25):启动器与选择器之WebBrowserTask 从名字上就看出来,这个家伙就是打开浏览并浏览到指定页面. 它有两个用途完全一样的属性:Uri属性是Syste ...

  9. 什么是 CGI,什么是 IIS,什么是VPS

    该公司来到天.我们所从事的事情在网站上.这对我来说确实是一个很大的挑战.个人一直从事Android,对于web而一个开发网站server知识的几乎为零.在这里应该说,现在我只是有一个技术人员,昨天相遇 ...

  10. 怎么样MyEclipse配置Tomcat?

    1.下载tomcat免安装版.tomcat路径不包含空格 http://download.csdn.net/detail/u014112584/7549191 2.windows -preferenc ...