SQLite数据库文件格式

数据库命名约定

sqlite3_open()API用到数据库的文件名,可以是相对当前工作目录的相对路径名,也可以是从系统根文件树开始的完整路径名。任何被本地文件系统接受的正规文件名都是好的。

如果文件名是C语言中的NULL指针(即,0),SQlite创建并打开一个临时文件。如果文件名是内存地址,SQLite创建一个内存数据库。在这两种情况中,当应用程序关闭数据库时,数据库都会被消灭,即数据库不是持久的。SQLite随机选择临时文件名(以sqlite_开头,后跟16位字母数字随机串)。文件尝试在以下目录存储,(1) /var/tmp, (2) /usr/tmp, (3) /tmp, (4) 当前工作目录。不管是什么方式打开的数据库(文件数据库,临时数据库,内存数据库),在SQLite内部都被命名为主数据库(main database)。

在内部,数据库文件名不是数据库名。他们是相关但是不同的概念。用attach命令,可以把一个数据库文件以不同的数据库别名关联到一个数据库连接上。可以通过这些别名访问数据库文件。

当应用程序用sqlite3_open()打开数据库时,SQLite会为每一个连接维护一个单独的临时数据库。临时数据库存储临时对象(表及其索引)。应用程序可以在其查询中用这两个名称(main和temp),例select * from temp.table1返回在临时数据库中表1的所有行,而不是主数据库中的。临时数据库的catalog名是sqlite_temp_master。临时对象只在相同的数据库连接内才是可见的,在对相同数据库的不同的连接是不可见的,即使是同一个线程,进程或是程序。SQlite把临时数据库存储在一个与主数据库文件不同的单独的临时文件中。当应用程序关闭到主数据库的连接时,会删除这个临时文件。

数据库文件系统

除了内存数据库,SQLite存储一整个数据库(main或temp)在一个单独的页中。

页:为了方便空间按管理,SQLite把数据库(包括内存数据库)划分成固定大小的区域,称为数据库的页(页大小为2的幂次方,从512到32768,默认1024。上界是由在代码中或在外部存储中的2字节的有符号整数确定的)。数据库是由页的数组(可扩大或缩小)组成的,数组的下标称为是页号,下标从1开始直到231 -1结束(上界由本地文件系统的最大文件长度确定)。第0页被作为没有此页或不是个页对待,总之是物理上不存在的页。第1页以及以后的页都是依次从数据库文件偏移量为0的位置开始排列。

一旦创建了数据库文件,SQLite采用默认的也大小,但是在创建第一个表之前,也可通过编译命令改变页大小。SQlite把页大小作为元数据的一部分来存储。将会用这个值代替默认的页大小(编译命令用来改变数据库的行为特性)。

页类型:有四种页:叶子页,内部页,溢出叶,自由页。自由页是无效(当前未被使用),其他的都是活跃的页。

B+树内部页有搜索导航信息,叶子页存储实际的数据(表中的行),如果一行信息量太大不能放入一个页中,则部分数据存入叶子页中,剩余的存在溢出页中。

B树有内部页有搜索信息和数据。

文件头:SQLite可以把任何页类型用于任何数据库页,除了第1页,它总是B+树的内部页。在该页0偏移地址处存储了100字节的文件头记录,文件头记录描述了数据库文件的数据结构。SQLite在建立一个数据库文件时初始化文件头。

Offset    Size      Description
0       16      Header string                This is the 16 byte string: "SQLite format 3."
16     2     Page size in bytes
18     1     File format write version
19     1     File format read version
20     1     Bytes reserved at the end of each page
21     1     Max embedded payload fraction
22     1     Min embedded payload fraction
23     1     Min leaf payload fraction
24     4     File change counter
28     4     Reserved for future use
32     4     First freelist page
36     4     Number of freelist pages
40     60     15 4-byte meta values

时间: 2024-10-16 18:21:14

SQLite数据库文件格式的相关文章

SQLite数据库学习小结(1)

1. SQlite概述 SQLite是一款轻量.快速.跨平台的嵌入式数据库,是遵守ACID(注:ACID指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability))的关系型数据库管理系统,它包含在一个相对小的C库中. SQLite 的设计目标是简单,从这种意义上说,SQLite 和其他很多现代的 SQL 数据库都不相同.SQLite 力求简单,即使这导致了它的某些特征偶尔执行效率比较

SQLite数据库的体系结构(翻译自sqlite.org)

$1 简介    本文档描述了SQLite库的体系结构,这些信息对那些想理解和修改SQLite的内部工作机制的人是有用的.    下图显示了SQLite的主要组成部件及其相互关系,下面的内容将描述每一个部件.(具体的图参见http://www.sqlite.org/arch2.gif) 本文档描述SQLite 3.0版本,2.8版或更早期的版本与此相似,只是细节上有所不同.$2 接口    虽然有些函数分布在其它的文件中,但是主要的SQLite库的公用接口函数是在main.c,legacy.c和

【Unity3D】使用MD5值,确保本地Sqlite数据库内容没有被篡改

Sqlite的应用场景 在判断是否使用存储格式为Sqlite模式的标准,我们的标准是内容只读.也就是说,除非发布者修改Sqlite内容,玩家只有读取的权限. 换个角度说,Sqlite里面的数据都是游戏基础配置数据,比如游戏的关卡(不包括玩家取得的成就).怪物的血量.装备的模板数据 对于如何使用Sqlite,请参考我的另外一篇文章<Unity本地数据存储---Sqlite和JSON> 问题重现 OK,既然我们选择了Sqlite作为存储手段之一,那么我们也嘚重视起安全性. 以android而言,我

windows命令行下导入excel数据到SQLite数据库

1.转换文件格式,防止中文乱码:将excel保存成"CSV(逗号分隔)(*.csv)"格式,关闭文件,用记事本打开刚才保存的.csv文件,然后另存为UTF-8格式文本.需要注意的是,经过这样的转换,数字也全变成文本了. 2.通过adb shell(adb.exe存放在android开发软件安装文件夹中,如 F:\Develope\Tools\adt-bundle-windows-x86\sdk\platform-tools\)更改sqlite数据库的使用权限.运行adb之前要先打开AV

在Android程序中使用已有的SQLite数据库

已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的数据库的文章,于是在谷歌上找到这篇英文文章,依照它的步骤,測试成功.决定把这篇文章大致的翻译一下,想看原文的能够点击这里:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ .

iOS中 FMDB第三方SQLite数据库 UI_20

1.什么是FMDB? FMDB是iOS平台下SQLite数据库,只不过它是OC方式封装了C语言的SQLite语句,使用起来更加面向对象 2.FMDB的优点:1.使用起来更加面向对象; 2.对比苹果自带的 Core Data 数据管理工具更加的轻量级,更加的灵活,而且FMDB支持跨平台; 3.提供多线程下的数据安全保护机制,有效地防止数据混乱 3.FMDM中重要的类: FMDBDataBase: 它代表一个数据库对象,(我们需要创建数据库对象时就使用这个类) FMDBDataBaseQueue:

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存

Sqlite数据库创建、删除、降级笔记

(1).在创建sqlite数据库时需要注意oncreate()方法只有在第一次创建数据库时候运行.当数据库删除后也会执行,sqlite不支持数据库删除,但可以删除相应的文件,即删了数据库.当我们再次配置文件时候就会执行oncreate()了. (2).onUpgrade()只有在版本号发生改变(增加)时候才会执行,很多时候我们直接在onUpgrade()里添加我们想插入的表或者列,但会报错,那是因为你之前版本onUpgrade里的语句会再次执行,若之前插入了表.或者行,此时会再执行一次,因此每次

Python操作SQLite数据库

连接数据库 从2.5版本开始,Python的标准库中就有了一个专门用于SQLite的sqlite3模块.连接SQLite数据库方式如下: import sqlite3 as dbapi con = dbapi.connect('population.db') cur = con.cursor() 第一个语句用于引用数据库API: 第二个语句创建了一个到数据库的连接(connection):调用数据库模块的connect方法.该方法的参数是一个字符串,它定义了我们所要连接的那个数据库.由于SQLi