火狐书签SQLite结构

16

我试图编写一个Firefox 3插件,使我能够轻松地重新标记书签。例如,我有一些被标记为“development”的书签和一些被标记为“Development”的书签,我希望有一种方法可以轻松地将所有“delelopment”标签更新为“Development”。不幸的是,我找不到一个插件来完成这个任务,所以我想创建自己的插件。

由于之前没有开发过插件,我已经掌握了基础知识,并发现FireFox将所有书签存储在名为Places.sqlite的SQLite数据库中。在该数据库中,有一个称为moz_bookmarks的表,其中包含书签目录中的所有书签、标签和文件夹。书签文件夹及其子书签的结构使用一个外键ID来表示,该ID指向同一表格中父文件夹的ID,然后递归向上到达该父文件夹的ID,直至到达书签根目录。

然而,我卡住的地方是firefox中应用的标签如何与书签相关联。每个标签的类型为2,父ID为4。但我看不出这与实际使用该标签的书签之间存在任何关联。如果我在firefox中添加一个书签而不将其放入特定文件夹中,但是给它2或3个标签,那么它的父文件夹ID就是5,对应于“未分类”,但我看不出与其相关联的标签之间有任何进一步的关联。

我在这里找到了有关结构的Wiki页面,但并没有真正帮助到我。

这让我抓狂了:( 请帮帮我...


5个回答

30

您可能已经自行发现,但标签的应用方法如下:

数据库中所有URL的中央位置是moz_places。 表moz_bookmarks通过外键列fk引用它。

如果您给书签打标签,则在moz_bookmarks中有多个条目,所有条目都具有相同的引用fk:第一个是书签本身(标题在title列中)。 每个标签都有一个额外的条目在moz_bookmarks中,具有相同的外键fk并且在parent列中引用标签(该列指向标签的moz_bookmarks行)。

如果您有一个名为“Stackoverflow”的书签'http://stackoverflow.com',其标签为'programming'和'info',则会得到:

moz_places
----------
id    url   (some more)
3636  http://stackoverflow.com

moz_bookmarks
-------------
id    type    fk     parent    title          (other columns omitted...)
332   1       3636   5         Stackoverflow  (parent=5 -> unfiled folder)
333   2       (NULL) 4         programming    (programming tag, parent=4 -> tags folder)
334   1       3636   333       (NULL)         (link to 'programming' tag)
335   2       (NULL) 4         info           (info tag, parent=4 see above)
336   1       3636   335       (NULL)         (link to 'info' tag)
希望这可以帮到你...

1
谢谢马丁在这么长时间后回答了这个问题。我已经有点放弃了,但是没有更新,所以非常感谢你的回答,继续保持好工作。 - Toby Mills

6

如MartinStettner所建议,标签结构基于标签id的外键,因此您首先需要确定目标标签的moz_bookmark.id。

这份Mozilla PDF解释了sqllite中的关系...

标签会在moz_bookmarks中产生两个新条目。第一个是标签,其parent=4(标签),fk=NULL。第二个条目跟随第一个条目,并将前一个标签作为其parent,而fk指向moz_places中的正确条目。

以此为指南...一旦您知道标签的id,就可以将moz_places.id与moz_bookmarks.fk连接起来...

    SELECT moz_places.id, moz_places.url, moz_places.title, moz_bookmarks.parent    
    FROM moz_places    
    LEFT OUTER JOIN moz_bookmarks    
    ON moz_places.id = moz_bookmarks.fk    
    WHERE moz_bookmarks.parent = N

导出...


3

我无法为您提供具体的操作步骤,但是也许扩展程序“SQLite Manager”可以帮助您找出需要做什么。该插件是一个通用管理器,但它还包含Firefox默认使用的数据库选项。

使用该扩展程序,重命名您喜欢的关键字应该相对简单。如果您只是想要解决问题,这可能有效,如果您仍然更喜欢编写自己的工具,也许这个工具可以帮助查询 ;)


谢谢您的评论,我发现了这个插件。它对于开发和一般的Firefox好奇心非常有用。 - Toby Mills

2
由于我需要深入挖掘以找到这些信息,因此请求获取所有书签的URL、标题和创建日期如下:
SELECT h.url, b.title, b.dateAdded
FROM moz_places h
JOIN moz_bookmarks b
ON h.id = b.fk;

我希望这能对需要这个答案的人有所帮助。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接