sqlite数据库

SQLite数据库C++ API封装

て烟熏妆下的殇ゞ 提交于 2020-01-09 06:19:41
   在一个项目中需要记录目标路径下所有文件的MD5值,由于SQLite简单易用,选择利用它来记录数据。唯一的一张数据表HistoricalMD5,三个属性Dir(完整路径)、Time(时间)、MD5。SQLite常用的C++ API有:sqlite3_open、sqlite3_prepare、sqlite3_bind_parameter_index、sqlite3_bind_text、sqlite3_column_count、sqlite3_step、sqlite3_finalize、sqlite3_close,为了调用方便,对这些函数做了以下封装。 Database.h #include <string> #include <vector> #include <sqlite3.h> using namespace std; class Database { public: Database(const char* filename); ~Database(); void insert(string dir, int time, string MD5); void update(string dir, int time, string MD5); void query(vector<vector<string> > &results); private: sqlite3

日常问题解决

陌路散爱 提交于 2020-01-08 13:31:07
需求1:sqlite两张同样数据结构的表,将数据合成到一张表中 场景:服务器上突然中断导致对sqlite的读写中断,数据库被锁,报database disk image is malformed的错误,导致重启后无法继续写入,将数据备份,重建数据库写入数据,后期需要数据合并。 需求2:服务器重启时自动启动某个程序 场景:录像处理的程序,若不启动,导致中转上面的数据堆积,磁盘占满,防止服务器重启后忘记启动这个程序,加入自动启动的机制 来源: https://www.cnblogs.com/mbaymax/p/12165925.html

仿SqlHelper的Sqlite数据库操作类SqlHelper

怎甘沉沦 提交于 2020-01-02 03:57:20
Code using System; using System.Configuration; using System.Data; using System.Data.Common; using System.Data.SQLite; using System.Collections; using System.Collections.Generic; namespace Aoner { /// <summary> /// AccHelper类提供很高的数据访问性能, /// 使用SQLite类的通用定义. /// </summary> public abstract class SqliteHelper { // 定义数据库连接串 public static string connStr = ConfigurationManager.AppSettings[ " SqliteConnection " ]; // 存贮Cache缓存的Hashtable集合 private static Hashtable parmCache = Hashtable.Synchronized( new Hashtable()); /// <summary> /// 使用连接字符串,执行一个SQLiteCommand命令(没有记录返回) /// 使用提供的参数集. /// </summary> ///

[747]SQLite-database disk image is malformed问题

帅比萌擦擦* 提交于 2019-12-30 10:10:50
SQLite-database disk image is malformed,此句英文的意思是数据库文件损坏。 怎么证明SQLite数据库文件损坏呢? 首先sqlite3 database_name进入数据库 然后运行命令 PRAGMA integrity_check; 如果数据库文件损坏就会报损坏的错误,如何数据库文件是完好的就会显示OK。 遇到这个问题怎么解决? 网上一般的做法有两种: 方法一: 1、在https://www.sqlite.org/download.html网站上下载sqlite-tools工具,我下载的是http://sqlite-tools-win32-x86-3250300.zip 2、解压上面的压缩包,并在命令行模式下进入该目录运行sqlite3.exe 3、打开损坏的数据库文件 .open d:/CloudPos.db 4、进行检测 PRAGMA integrity_check; 5、设置导出文件为tmp.sql .output d:/tmp.sql 6、将CloudPos.db中的内容以sql方式导出到tmp.sql .dump 7、创建temp.db数据库 .open d:/temp.db 8、从tmp.sql中导入数据 .read d:/tmp.sql 9、退出 .quit 方法二: 使用SQLite Expert

SQLite 剖析

人走茶凉 提交于 2019-12-29 03:01:50
由于sqlite对多进程操作支持效果不太理想,在项目中,为了避免频繁读写 文件数据库带来的性能损耗,我们可以采用操作sqlite内存数据库,并将内存数据库定时同步到文件数据库中的方法。 实现思路如下: 1、创建文件数据库; 2、创建内存数据库(文件数据库、内存数据库的内部表结构需要一致); 3、在内存数据库中attach文件数据库,这样可以保证文件数据库中的内容在内存数据库中可见; 4、对于insert、select操作,在内存数据库中完成,对于delete、update操作,需要同时访问内存、文件数据库; 5、定时将内存数据库中的内容flush到文件数据库。 一、内存数据库: 在SQLite中,数据库通常是存储在磁盘文件中的。然而在有些情况下,我们可以让数据库始终驻留在内存中。最常用的一种方式是在调用sqlite3_open()的时候,数据库文件名参数传递":memory:",如: rc = sqlite3_open(" :memory: ", &db); 在调用完以上函数后,不会有任何磁盘文件被生成,取而代之的是,一个新的数据库在纯内存中被成功创建了。由于没有持久化,该数据库在当前数据库连接被关闭后就会立刻消失。需要注意的是,尽管多个数据库连接都可以通过上面的方法创建内存数据库,然而它们却是不同的数据库,相互之间没有任何关系。事实上

SQLite学习笔记(七)&&事务处理

自作多情 提交于 2019-12-29 03:01:06
说到事务一定会提到ACID,所谓事务的原子性,一致性,隔离性和持久性。对于一个数据库而言,通常通过并发控制和故障恢复手段来保证事务在正常和异常情况下的ACID特性。sqlite也不例外,虽然简单,依然有自己的并发控制和故障恢复机制。 Sqlite学习笔记(五)&&SQLite封锁机制 已经讲了一些锁机制的原理,本文将会详细介绍一个事务从开始,到执行,最后到提交所经历的过程,其中会穿插讲一些sqlite中锁管理,缓存管理和日志管理的机制,同时会介绍在异常情况下(软硬件故障,比如程序异常crash,主机掉电等),sqlite如何将数据库恢复到事务之前的状态。本文大量参考了sqlite的官方文档,结合自己的理解,希望能把这个过程说清楚。 1.事务提交 1.1 开启一个事务 在向数据库文件写数据前,sqlite首先需要访问sqlite_master表获取元数据信息,用来对SQL语句进行语义分析,判断语句的合法性。从数据库读数据第一步,是对数据库文件上一个Shared Lock。Shared Lock允许多个事务同时读一个数据库文件,但是Shared Lock会阻止写事务向数据库文件写入数据。 1.2 读数据 获取Shared Lock后,我们可以从数据库文件中读取数据了。我们假设缓存中没有我们的page,因此需要通过读文件读取我们需要的page。这里说明下

sqlite之WAL模式

别来无恙 提交于 2019-12-29 02:59:25
链接 概述 在3.7.0以后,WAL(Write-Ahead Log)模式可以使用,是另一种实现事务原子性的方法。 WAL的优点 在大多数情况下更快 并行性更高。因为读操作和写操作可以并行。 文件IO更加有序化,串行化(more sequential) 使用fsync()的次数更少,在fsync()调用时好时坏的机器上较为未定。 缺点 一般情况下需要VFS支持共享内存模式。(shared-memory primitives) 操作数据库文件的进程必须在同一台主机上,不能用在网络操作系统。 持有多个数据库文件的数据库连接对于单个数据库时原子的,对于全部数据库是不原子的。 进入WAL模式以后不能修改page的size。 不能打开只读的WAL数据库(Read-Only Databases),这进程必须有"-shm"文件的写权限。 对于只进行读操作,很少进行写操作的数据库,要慢那么1到2个百分点。 会有多余的"-wal"和"-shm"文件 需要开发者注意 checkpointing 原理 回滚日志的方法是把为改变的数据库文件内容写入日志里,然后把改变后的内容直接写到数据库文件中去。在系统crash或掉电的情况下,日志里的内容被重新写入数据库文件中。日志文件被删除,标志commit着一次commit的结束。 WAL模式于此此相反。原始为改变的数据库内容在数据库文件中

SQLite这么娇小可爱,不多了解点都不行啊

烂漫一生 提交于 2019-12-29 02:58:45
简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。它的设计目标是嵌入式的,目前Android和iOS的设备内置的都是SQLite数据库。SQLite虽然娇小,但也支持事务和多数的SQL92标准。 主要特点 Zero-Configuration 无需安装和管理配置。 Serverless 无需服务器支持。 Single Database File 数据文件存储在一个单一的磁盘文件。 Stable Cross-Platform Database File 数据库文件格式跨平台,无论是大小端,或者是32bit或64bit机器都没有关系 Compact 完整特性的SQLite编译出来在500KiB左右,裁剪特性甚至可以得到低于300KiB的库(当前版本3.8.11.1)。 Manifest typing 可以声明数据库字段类型,但是字段存储的类型实际的存储类型和实际值相关,单独的一个字段可能包含不同存储类的值。 Variable-length records 可变长度记录,例如你存储一个字符到VARCHAR(100) 的列,实际需要的存储空间一个字符加一个字节的存储空间。 SQL statements compile into virtual machine code SQL语句会被编译成虚拟机代码,这种虚拟机代码直白可读,便于调试。 Public domain

Sqlite事物与锁

坚强是说给别人听的谎言 提交于 2019-12-29 02:58:07
1事务 事务定义了一组SQL命令的边界,这组命令或者作为一个整体被全部执行,或者都不执行。事务的典型实例是转帐。 2事务的范围 事务由3个命令控制:BEGIN、COMMIT和ROLLBACK。BEGIN开始一个事务,之后的所有操作都可以取消。COMMIT使BEGIN后的所有命令得到确认;而ROLLBACK还原BEGIN之后的所有操作。如: sqlite> BEGIN; sqlite> DELETE FROM foods; sqlite> ROLLBACK; sqlite> SELECT COUNT(*) FROM foods; 上面开始了一个事务,先删除了foods表的所有行,但是又用ROLLBACK进行了回卷。再执行SELECT时发现表中没发生任何改变。 SQLite默认情况下,每条SQL语句自成事务(自动提交模式)。 3冲突解决 违反约束会导致事务的非法结束。大多数数据库(管理系统)都是简单地将前面所做的修改全部取消。 SQLite有其独特的方法来处理约束违反(或说从约束违反中恢复),被称为冲突解决。如: sqlite> UPDATE foods SET id=800-id; SQL error: PRIMARY KEY must be unique SQLite提供5种冲突解决方案:REPLACE、IGNORE、FAIL、ABORT和ROLLBACK。 REPLACE:

SQLite这么娇小可爱,不多了解点都不行啊

十年热恋 提交于 2019-12-29 02:57:09
在我眼里,MySQL和Oracle是这样的 而SQLite在是这样的 所以这么萌的数据库,我真的应该多了解她的。 简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。它的设计目标是嵌入式的,目前Android和iOS的设备内置的都是SQLite数据库。 SQLite虽然娇小,但也支持事务和多数的SQL92标准。 主要特点 1. Zero-Configuration 无需安装和管理配置。 2. Serverless 无需服务器支持。 3. Single Database File 数据文件存储在一个单一的磁盘文件。 4. Stable Cross-Platform Database File 数据库文件格式跨平台,无论是大小端,或者是32bit或64bit机器都没有关系 5. Compact 完整特性的SQLite编译出来在500KiB左右,裁剪特性甚至可以得到低于300KiB的库(当前版本3.8.11.1)。 6. Manifest typing 可以声明数据库字段类型,但是字段存储的类型实际的存储类型和实际值相关,单独的一个字段可能包含不同存储类的值。 7. Variable-length records 可变长度记录,例如你存储一个字符到VARCHAR(100) 的列,实际需要的存储空间一个字符加一个字节的存储空间。 8. SQL statements