Ditto表结构解析

前言

搞清楚ditto的表结构,有如下作用:

  • 可以对ditto进行二次开发。
  • 对程序中的数据进行分析。
  • 批量导入自己需要的数据。

这是比较小众的需求,所以在这里做一个记录,为自己所使用。

版本信息

  • version 03.22.20.00 64bit
  • sqlite Version 3.26.0

https://ditto-cp.sourceforge.io/

表结构

总共5张表

  • Main
  • Data
  • MainDeletes
  • CopyBuffers
  • Types

主要的数据在Data表,相关的列表数据在Main表,其它的表是辅助。

Main 主信息表

重点关注

  • lID 主键
  • mText 显示的文本
  • bIsGroup 是否为group
  • lParentID 父结点ID
  • lShortCut 快捷键

这些信息都可以在程序中的属性中看到相应的数据。

这里会有两类信息,剪贴版信息的记录,组信息的记录,区别是bIsGroup 是为1。1-组记录。

剪贴版信息的记录归属到某组下,lParentID中就会记录相应组的主ID。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE Main (
lID INTEGER PRIMARY KEY AUTOINCREMENT,
lDate INTEGER,
mText TEXT,
lShortCut INTEGER,
lDontAutoDelete INTEGER,
CRC INTEGER,
bIsGroup INTEGER,
lParentID INTEGER,
QuickPasteText TEXT,
clipOrder REAL,
clipGroupOrder REAL,
globalShortCut INTEGER,
lastPasteDate INTEGER,
stickyClipOrder REAL,
stickyClipGroupOrder REAL,
MoveToGroupShortCut INTEGER,
GlobalMoveToGroupShortCut INTEGER
);

Data 主数据表

  • lID 主键
  • lParentID 关联主信息表的主键
  • strClipBoardFormat 数据格式
  • ooData 以BLOB类型存的数据

在程序中是无法预览ooData中的数据的,但最后复制出来的数据就是这个字段中的数据。
通过sqlite管理软件,可以看到里面的数据。

1
2
3
4
5
6
CREATE TABLE Data (
lID INTEGER PRIMARY KEY AUTOINCREMENT,
lParentID INTEGER,
strClipBoardFormat TEXT,
ooData BLOB
);

关于数据类型

剪贴板的数据类型定义在微软的文档中。
https://docs.microsoft.com/en-us/windows/win32/dataxchg/standard-clipboard-formats

程序中默认的有:

  • CF_DIB
  • CF_HDROP
  • CF_TEXT
  • CF_UNICODETEXT
  • Rich Text Format

我们常用的有

  • 文本类,CF_TEXT,CF_UNICODETEXT,不同的是前者是ANSI text,后者是Unicode text。
  • 文件类, CF_HDROP,是一个或者多个文件

其它

SQLite没有存储存储日期和/或者时间的存储类。
相反,SQLite的内置日期和时间函数能够将日期和时间存储为文本,实数或者整数值
https://www.sqlite.org/lang_datefunc.html

后话

聊聊写这个文章的原因

在使用ditto时,发现功能:
输入查找的关键字与需要复制的关键字可以不一样。
于是可以满住这样一个需求,比如我要打一个人的名字,张三。
可以在 ditto中拷贝张三,设置找个这个关键字的为zs。
这样我在频繁输入张三时,可能用zs在ditto查找,并代替。

我有很多这样的关键字要录入到ditto中。
目前ditto支持导入单独一个剪贴版,但不支持其它文件格式的导入。

于是我分析下ditto的db格式,把需要写入的内容用其它程序到db中,就可以满住自己的需求。

这就是开源软件的好处之一吧


Ditto表结构解析
https://blog.fengcl.com/2020/09/12/ditto-table-analytics/
作者
frank
发布于
2020年9月12日
许可协议