❶ 好多说sqlite不需要安装,不需要配置。但也有的说需要配置,高手指点下!最好具体点
这要看你是干什么的了?要是写程序,就不用安装,只要把源代码编译成库文件,然后includesqliteX.h就可以了。要是你想装可视的客户端,就要安装相应的客户端啊。如果用控制台操作sqlite可能还需要设置环境变量吧?记不太清了。反正很简单的配置。但是你的问题提的,让人不好帮你……我也只能说到这里了。如果还有问题,你可以追问。
❷ 配置文件夹里的places.sqlite是什么东西
Lightroom 的「目录」结构(这里的目录是指Lightroom的目录(Catalog),不是指文件系统的目录结构)。lightroom放置预设、备份等文件的目录:菜单–>编辑–>「目录」设置,在这里能看到Lightroom的目录信息,这个目录的路径是可以更改的。Windows用户的lightroom默认目录在:C:\Users\admin\AppData\Roaming\Adobe\Lightroom里面的admin是我在使用的用户名,可能每个人的用户名不一样,根据需要替换即可。MAC用户的lightroom默认目录在:/Users/YOURUSERNAME/Library/Application Support/Adobe/Lightroom/。Lightroom 主目录结构如下:Lightroom设置目录,是本文要描述的重点Backups 主「目录」文件的自动备份目录Lightroom 5 Catalog Previews.lrdata————【LR预览缩略图目录】Lightroom 5 Catalog.lrcat————【主「目录」文件,其实是个SQLite数据库】Lightroom 5 Catalog.lrcat-journal————【SQLite运行时日志文件】Lightroom 5 Catalog.lrcat.lock————【LR运行时锁定文件】Lightroom 设置————【Lightroom 设置目录,是本文要描述的重点】其中比较重要的,也是我们重点讲的是lightroom设置目录。Lightroom 设置的目录结构如下:方框内的Develop Presets是存储LR预设的文件夹,圆形圈起来的文件夹分别是相机配置文件和曲线调整预设,有的同学lightroom设置目录里可能没有,这也是很多同学安装相机配置一直不成功的原因,后面会讲到如何解决。Auto Layout Presets————【LR界面布局设置】CameraProfiles————【相机校准文件目录】Develop Presets————【LR预设目录,包括系统自带预设和用户自定义预设】Export Actions————【导出后的动作配置文件】Export Presets ————【导出预设】External Editor Presets————【外部扩展工作预设】Filename Templates————【导出时的文件名设定模板】Filter Presets————【过滤方案预设】FTP Presets————【FTP发布方案预设】Import Presets————【导入方案预设】Keyword Sets————【关键字集合预设】Label Sets【标签集】Local Adjustment Presets————【局部调整预设,用于渐变滤镜、调整画笔】Locations————【位置信息预设,如果要给照片加GPS坐标会用到】Metadata Presets————【元数据预设】Slideshow Templates————【幻灯片模板】Text Style Presets————【文本样式预设(应该和幻灯片、web、相册、打印相关)】Text Templates————【文本模板,功能同上】Watermarks————【水印】Web Templates————【web发布模板】lightroom预设文件夹找到这个文件夹,你就可以快速将大量预设复制粘贴进来,而不用一个个导入。Develop Presets 是在“修改照片”界面的左侧的“预设”中,可以看到不同的预设目录以及文件。需要注意的是,Lightroom预设在Windows 和 MAC 上是通用的。
❸ 用c3p0连接池和sqlite数据库怎样写xml配置文件
1.XML格式是W3C的标准,各种平台通用,可移植性好。而Windows下的注册表文件,基本上是黑盒,也不可能被移植到非Windows环境下。2.XML提供了一种树形层次结构,可以很方便的定位某一功能块。而INI文件不提供这种便利。3.从写的角度看,几乎所有的应用程序都能处理XML文件,并且通过DOM提供的方法可以很快捷的对XML文件进行操作,而Reg只能用特定的软件进行读取操作,而INI很难进行方便的操作。4.从读的角度看,XML文件提供了一种简洁的自解释的标记方法,几乎不需要说明文档,就能理解XML格式的配置文件的意义。而Reg很难辨识,INI虽然大多情况下比较容易理解,但不可能包含太多的内容。5.XML高度可扩展,只要遵循一定的规则,XML的可扩展性几乎是无限的,而且这种扩展并不以结构混乱或影响基础配置为代价。而庞大的INI文件几乎一定是混乱的。当然,即使XML有如此多的好处,它也存在一定的缺点,就是在表达较短的配置时,没有INI简练。而且因为它有比较严格的格式审查机制,容错性也不是特别好。但在绝大多数情况下,以XML文件做为配置文件,从长远来看,还是最好的选择。
❹ php 配置sqlite
PHP5已经绑定sqlite1、手动添加的php的pdo的驱动扩展支持,在PHP.ini添加extension=php_pdo.dllextension=php_pdo_sqlite.dllextension=php_sqlite.dllextension_dir="C:"2、在C:保证有php_sqlite.dll,php_pdo_sqlite.dll,php_pdo.dll扩展库3、重启apache4、下载SQLitemanager,createadatabase,保存名“db.sqlite”的数据库,建表,或者sqliteadmin5、在PHP链接SQLite方法一、$db=newPDO('sqlite:db.sqlite');print_r($db);$sth=$db->query("select*fromaqo");方法二、if($db=sqlite_open('db.db',0666,$sqliteerror)){sqlite_query($db,'CREATETABLEfoo(barvarchar(10))');sqlite_query($db,"INSERTINTOfooVALUES('fnord')");$result=sqlite_query($db,'selectbarfromfoo');var_mp(sqlite_fetch_array($result));}else{die($sqliteerror);}
❺ 用c3p0连接池和sqlite数据库怎样写xml配置文件
1.XML格式是W3C的标准,各种平台通用,可移植性好。而Windows下的注册表文件,基本上是黑盒,也不可能被移植到非Windows环境下。2.XML提供了一种树形层次结构,可以很方便的定位某一功能块。而INI文件不提供这种便利。3.从写的角度看,几乎所有的应用程序都能处理XML文件,并且通过DOM提供的方法可以很快捷的对XML文件进行操作,而Reg只能用特定的软件进行读取操作,而INI很难进行方便的操作。4.从读的角度看,XML文件提供了一种简洁的自解释的标记方法,几乎不需要说明文档,就能理解XML格式的配置文件的意义。而Reg很难辨识,INI虽然大多情况下比较容易理解,但不可能包含太多的内容。5.XML高度可扩展,只要遵循一定的规则,XML的可扩展性几乎是无限的,而且这种扩展并不以结构混乱或影响基础配置为代价。而庞大的INI文件几乎一定是混乱的。当然,即使XML有如此多的好处,它也存在一定的缺点,就是在表达较短的配置时,没有INI简练。而且因为它有比较严格的格式审查机制,容错性也不是特别好。但在绝大多数情况下,以XML文件做为配置文件,从长远来看,还是最好的选择。
❻ 如何配置sqlite的数据库地址
我的数据库文件放在app_Data中目前的配置为 <property name="connection.connection_string"> Data Source=test.db;Version=3 </property>将data source的地址设置成相对地址,以下配置我都有试过没有作用:./app_Data/test.db
❼ 程序的配置信息写在sqlite中与写在config哪个更好
使用SQLite方式存储数据在Android中一共提供了5种数据存储方式,分别为:(1)Files:通过FileInputStream和FileOutputStream对文件进行操作。具体使用方法可以参阅博文《Android学习笔记34:使用文件存储数据》。(2)Shared Preferences:常用来存储键值对形式的数据,对系统配置信息进行保存。具体使用方法可以参阅博文《Android学习笔记35:使用Shared Preferences方式存储数据》。(3)Content Providers:数据共享,用于应用程序之间数据的访问。(4)SQLite:Android自带的轻量级关系型数据库,支持SQL语言,用来存储大量的数据,并且能够对数据进行使用、更新、维护等操作。(5)Network:通过网络来存储和获取数据。本篇博文介绍第四种方式,通过Android自带的SQLite数据库存储数据。1.SQLite简介SQLite是一款开源的、嵌入式关系型数据库,第一个版本Alpha发布于2000年。SQLite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。SQLite和C/S模式的数据库软件不同,它是一款嵌入式数据库,没有独立运行的进程,与所服务的应用程序在应用程序进程空间内共生共存。它的代码与应用程序代码也是在一起的,或者说嵌入其中,作为托管它的程序的一部分。因此不存在数据库的客户端和服务器,使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。数据库服务器在程序中的好处是不需要网络配置或管理。将数据库客户端与服务器运行在同一个进程中,可以省去不少的操作及麻烦:不用担心防火墙或者地址解析;不用浪费时间管理复杂的授权和权限;可以减少网络调用相关的消耗;可以简化数据库管理并使程序更容易部署。SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但是只有一个可以写入数据。在某个进程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读写操作将不会再发生。此外,SQLite数据库中的所有信息(比如表、视图、触发器等)都包含在一个文件内,方便管理和维护。SQLite数据库还支持大部分操作系统,除电脑上使用的操作系统之外,很多手机上使用的操作系统同样可以运行。同时,SQLite数据库还提供了多语言的编程接口,供开发者使用。2.SQL基本命令SQL是与关系型数据库通信的唯一方式。它专注于信息处理,是为构建、读取、写入、排序、过滤、映射、分组、聚集和通常的管理信息而设计的声明式语言。在讲解SQL基本命令之前,有必要先了解一下SQLite所支持的数据类型都有哪些。2.1 SQLite支持的数据类型SQLite采用动态数据存储类型,会根据存入的值自动进行判断。SQLite支持以下5种数据类型:(1)NULL:空值(2)INTEGER:带符号的整型(3)REAL:浮点型(4)TEXT:字符串文本(5)BLOB:二进制对象2.2 SQL基本命令表是探索SQLite中SQL的起点,也是关系型数据库中信息的标准单位,所有的操作都是以表为中心的。那么如何使用SQL命令创建一张表呢?2.2.1创建表表是由行和列组成的,列称为字段,行称为记录。使用CREATE命令可以创建表,CREATE命令的一般格式为:CREATE [TEMP/TEMPORARY] TABLE table_name (column_definitions [, constraints]);其中,[]中的内容是可选的,用TEMP或TEMPORARY关键字声明的表是临时表,这种表只存活于当前会话,一旦连接断开,就会被自动销毁。如果没有明确指出创建的表是临时表,则创建的是基本表,将会在数据库中持久存在,这也是数据库中最常见的表。CREATE TABLE命令至少需要一个表名和一个字段名,上述命令中的table_name表示表名,表名必须与其他标识符不同。column_definitions由用逗号分隔的字段列表组成,每个字段定义包括一个名称、一个域(类型)和一个逗号分隔的字段约束。其中,域是指存储在该列的信息的类型,约束用来控制什么样的值可以存储在表中或特定的字段中。一条创建表的命令示例如下:1 CREATE TABLE tab_student (studentId INTEGER PRIMARY KEY AUTOINCREMENT, 2 studentName VARCHAR(20), 3 studentAge INTEGER);如上,我们创建了一个名为tab_student的表,该表包含3个字段:studentId、 studentName和studentAge,其数据类型分别为:INTEGER、VARCHAR和INTEGER。此外,通过使用关键字PRIMARY KEY,我们指定了字段studentId所在的列是主键。主键确保了每一行记录在某种方式上与表中的其他行记录是不同的(唯一的),进而确保了表中的所有字段都是可寻址的。SQLite为主键提供自增长功能,当定义字段类型为INTEGER PRIMARY KEY时,SQLite将为该字段创建默认值,该默认值确保整数值是唯一的。SQLite使用64-bit单符号整数主键,因此,该字段的最大值是9,223,372,036,854,775,807。当达到最大值时,SQLite会自动搜索该字段还未使用的值,并作为要插入的值。从表中删除记录时,rowid可能被回收并在后面的插入中使用。因此,新创建的rowid不一定是按照严格顺序增长的。如果想要SQLite使用唯一的自动主键值,而不是填补空白,可以在主键定义INTEGER PRIMARY KEY中加入关键字AUTOINCREMENT。AUTOINCREMENT关键字阻止rowid回收,它将为新插入的记录产生新的(不是回收的)rowid。2.2.2插入记录使用INSERT命令可以一次插入一条记录,INSERT命令的一般格式为:INSERT INTO tab_name (column_list) VALUES (value_list);其中,tab_name指明将数据插入到哪个表中,column_list是用逗号分隔的字段名称,这些字段必须是表中存在的,value_list是用逗号分隔的值列表,这些值是与column_list中的字段一一对应的。比如,向刚才创建的tab_student表中插入一条记录,便可以使用如下的语句完成:INSERT INTO tab_student (studentId, studentName, studentAge) VALUES (1, “jack”, 23);通过以上的语句,便插入了一条studentName=”jack”, studentAge=”23”的记录,该记录的主键为studentId=1。2.2.3更新记录使用UPDATE命令可以更新表中的记录,该命令可以修改一个表中一行或者多行中的一个或多个字段。UPDATE命令的一般格式为:UPDATE tab_name SET update_list WHERE predicate;其中,update_list是一个或多个字段赋值的列表,字段赋值的格式为column_name=value。WHERE子句使用断言识别要修改的行,然后将更新列应用到这些行。比如,要更新刚才插入到tab_student表中的记录,便可以使用如下的语句完成:UPDATE tab_student SET studentName=”tom”, studentAge=”25” WHERE studentId=1;通过以上的语句,便可以将刚才插入的主键为studentId=1的记录更新为studentName=”tom”, studentAge=”25”了。2.2.4删除记录使用DELETE命令可以删除表中的记录,DELETE命令的一般格式为:DELETE FROM table_name WHERE predicate;其中,table_name指明所要删除的记录位于哪个表中。和UPDATE命令一样,WHERE子句使用断言识别要删除的行。比如,要删除刚才插入的记录,便可以使用如下的语句完成:DELETE FROM tab_student WHERE studentId=1;2.2.5查询记录SELECT命令是查询数据库的唯一命令。SELECT命令也是SQL命令中最大、最复杂的命令。SELECT命令的通用形式如下:SELECT [distinct] heading FROM tables WHERE predicate GROUP BY columns HAVING predicate ORDER BY columns LIMIT count,offset;其中,每个关键字(如FROM、WHERE、HAVING等)都是一个单独的子句,每个子句由关键字和跟随的参数构成。GROUP BY和HAVING一起工作可以对GROUP BY进行约束。ORDER BY使记录集在返回之前按一个或多个字段的值进行排序,可以指定排序方式为ASC(默认的升序)或DESC(降序)。此外,还可以使用LIMIT限定结果集的大小和范围,count指定返回记录的最大数量,offset指定偏移的记录数。在上述的SELECT命令通用形式中,除了SELECT之外,所有的子句都是可选的。目前最常用的SELECT命令由三个子句组成:SELECT、FROM、WHERE,其基本语法形式如下:SELECT heading FROM tables WHERE predicate;比如,要查询刚才插入的记录,便可以使用如下的语句完成:SELECT studentId, studentName, studentAge FROM tab_student WHERE studentId=1;至此,我们介绍了SQL中最基本和最常用的CREATE、INSERT、UPDATE、DELETE和SELECT命令。当然了,这里只是对其进行了简单的介绍,有关SQLite中SQL命令的详细使用方法,可以参阅《SQLite权威指南》一书的第三章和第四章。3.数据库操作辅助类SQLiteOpenHelperAndroid提供了一个重要的类SQLiteOpenHelper,用于辅助用户对SQLite数据库进行操作。SQLiteOpenHelper的构造函数原型如下:public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version);其中,参数context表示应用程序运行的环境,包含应用程序所需的共享资源。参数name表示Android的数据库名字。参数factory是SQLiteDatabase.CursorFactory类对象,用于存储查询Android SQLite数据库的结果集。参数version表示应用程序所用的数据库的版本,该版本并非SQLite的真正版本,而是指定应用程序中的SQLite数据库的版本,当该版本号发生变化时,将会触发SQLiteOpenHelper类中的onUpgrade()或onDowngrade()方法。SQLiteOpenHelper类的所有方法如图1所示。图1 SQLiteOpenHelper类的方法其中,close()方法用于关闭SQLiteOpenHelper对象中的SQLite数据库;getReadableDatabase()方法和getWriteableDatabase()方法类似,getReadableDatabase()方法以只读状态打开SQLiteOpenHelper对象中指定的SQLite数据库,任何想要修改数据库的操作都是不允许的;getWriteableDatabase()方法也是打开数据库,但是允许数据库正常的读/写操作;在一个不存在的数据库上调用任何方法时,都会隐式的调用SQLiteOpenHelper对象的onCreate()方法;当应用程序第一次访问数据库时,则会调用onOpen()方法,但是,如果版本号发生了变化的话,则会调用onUpgrade()或onDowngrade()方法。4.数据库类SQLiteDatabaseSQLiteDatabase类用来完成对数据库的操作任务,比如表的选择、插入、更新和删除语句等。SQLiteDatabase类中常用的用于执行SQL语句的方法有以下一些。(1)execSQL()方法:public void execSQL (String sql);public void execSQL (String sql, Object[] bindArgs);(2)query()方法:public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having,String orderBy, String limit);public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit, CancellationSignal cancellationSignal);public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having,String orderBy);public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);(3)queryWithFactory()方法:public Cursor queryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[]columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit,CancellationSignal cancellationSignal);public Cursor queryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[]columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);(4)rawQuery()方法:public Cursor rawQuery (String sql, String[] selectionArgs, CancellationSignal cancellationSignal);public Cursor rawQuery (String sql, String[] selectionArgs);(5)rawQueryWithFactory()方法:public Cursor rawQueryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, String sql, String[] selectionArgs,String editTable);public Cursor rawQueryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, String sql, String[] selectionArgs,String editTable, CancellationSignal cancellationSignal);其中,execSQL()方法都有一个参数sql,这个参数是一个SQL语句。第二个参数bindArgs接收一个数组,数组中的每个成员捆绑了一个查询。execSQL()方法用于运行那些没有返回值的查询语句,比如创建、插入、更新和修改表。query()方法和queryWithFactory()方法是在数据库中运行一些轻量级的单查询语句,参数包括table、columns、groupBy、having、orderBy、limit等SQL语句关键字。这些方法允许将SQL语句传递给相关方法,而不必直接使用SQL语句。rawQuery()方法和rawQueryWithFactory()方法也都有一个参数sql,用于执行SQL查询语句,返回值是Cursor对象。这两个方法都有一个版本能够接收一个字符串数组selectionArgs作为参数,通过这个参数,SQLiteDatabase对象将把捆绑的SQL语句中的问号(?)用这个数组中的值代替,并按照一一对应的位置关系进行取代。SQLiteDatabase类提供了大约50个方法,除此之外还有一些用于打开数据库的方法(如openDatabase()、openOrCreateDatabase()等),用于管理SQLite事务的方法(如beginTransaction()、endTransaction()等),用于测试数据库是否被锁住的方法(如isDbLockedByCurrentThread()、isDbLockedByOtherThread()等),以及获取数据库基本信息的方法(如getMaximumSiza()、getVersion()等)。这里就不一一介绍了,具体可以参阅SQLiteDatabase类的API帮助文档。
❽ 如何破解sqlite数据库文件
针对sqlite数据库文件,进行加密。现有两种方案如下:1.对数据库中的数据进行加密。2.对数据库文件进行加密1.uin怎么获取?这个uin不是登录的帐号,而是属于内部的、程序界面上不可见的一个编号。至于查看,最简单的方法就是登录web微信后,按F12打开网页调试工具,然后ctrl+F搜索“uin”,可以找到一串长长的URL,里面的uin就是当前登录的微信的uin。还 有一种方法就是配置文件里,导出的微信目录下有几个cfg文件,这几个文件里有保存,不过是java的hashmap,怎么解析留给小伙伴们自己琢磨吧, 还有就是有朋友反应退出微信(后台运行不叫退出)或者注销微信后会清空这些配置信息,所以小伙伴们导出的时候记得在微信登陆状态下导出。博主自己鼓捣了一 个小程序来完成解析。2.一个手机多个登录帐号怎么办(没有uin怎么办)根 据博主那个解密的帖子,必须知道串号和uin。串号好说,配置中一般都有可以搞到,uin从配置中读取出来的时候只有当前登录的或者最后登录的,其他的几 个记录都没办法解密。网上某软件的解决方法是让用户一个一个登录后再导出。这个解决方法在某些情况下是不可能的,或者有时候根本不知道uin。后来经过一个朋友的指点,博主终于发现了解决方法,可以从配置中秒读出来这个uin,这个方法暂时不透漏了,只是说明下这个异常情况。3.串号和uin怎么都正确的怎么还是没办法解密先 说说串号这个玩意,几个热心的朋友反馈了这个问题,经过博主测试发现不同的手机使用的不一定是IMEI,也可能是IMSI等等,而且串号也不一定是标准的 15位,可能是各种奇葩,比如输入*#06#出来的是一个,但是在微信程序里用的却是另一个非常奇葩的东西,这种情况多在双卡双待和山寨机中出现,经过严 格的测试,现在已经能做到精确识别,那几位热心的朋友也赠与了不同的代码表示鼓励。4.计算出来了正确的key为什么无法打开数据库文件微 信这个变态用的不是标准的sqlite数据库,那个帖子也提到了不是数据库加密,是文件的内容加密,其实是sqlcipher。官方上竟然还卖到 149$,不过倒是开放了源码,水平够高的可以自己尝试编译。google还能搜索到sqlcipher for windows这个很好编译,不过博主不知是长相问题还是人品问题,编译出来的无法打开微信的数据库,后来改了这份代码才完成。5.数据库文件内容是加密的,怎么还原这 个是某些特殊情况下用到的,比如聊天记录删除了数据库中就没了,但是某个网友测试说数据库无法查询出来了,但是在文件中还是有残留的。这个情况我没测试 过,不过想想感觉有这个可能,就跟硬盘上删除了文件其实就是删除了文件的硬盘索引,内容还是残留在硬盘上可以还原一样,sqlite数据库删除的条目只是 抹去了索引,内容还存在这个文件中。网上的都是直接打开读取,并没有解密还原这个文件成普通的sqlite数据库,使用sqlcipher 的导出方法也只是将可查询的内容导出。后来博主花了时间通读了内容加密的方式,做了一个小程序将加密的文件内容直接解密,不操作修改任何数据,非数据库转 换,直接数据流解密,完全还原出来了原始的未加密的数据库文件,大小不变,无内容损失,可以直接用sqlite admin等工具直接打开。6.已经删除的聊天内容可以恢复么通过上述第5的方式还原出原数据后,经测试可以恢复。sqlite的删除并不会从文件中彻底删掉,而是抹掉索引,所以可以通过扫描原始文件恢复。前提是没有重装过微信。。。两种加密方式的优缺点,比较如下:一、对数据库中的数据进行加密优点:1.实现数据加密快速,只需添加两个方法一是:对明文数据进行加密返回密文数据二是:对密文数据进行解密返回明文数据2.程序无需进行太大变动,仅在对数据进行添加,修改,删除,查询时。针对指定的表字段进行修改进行加密,解密的字段即可。不足:1.由于对数据进行了加密。所以为了看到明文,必须密文进行解密。因此会增加处理器的消耗。因终端手机的处理能力有限,可能会出现处理数据缓慢的现象发生。2.仅仅对数据进行了加密,还是可以看到数据表的sql语句,可能猜测到表的作用。另外,如果没有对一个表中的所有字段加密,则可以看没有加密的明文数据。需要做的工作:1.无需考虑平台差异性,qt,android,ios都能快速的实现。只需在每个平台上,使用各自的语言,实现同样的加密,解密算法即可。2.需要对加密算法进行了解,选择一种加密算法,进行实现。二、对数据库文件进行加密优点:1.对整个文件进行了加密,用户通过编辑器看不到任何有用的数据,用户使用sqlite browser软件也无法打开文件查看数据,保证了数据安全。2.进行打开数据库时,使用程序sqlite3_key(db,”********”,8);即可对文件解密,对数据表的操作无需进行加密,采用明文即可。不足:1.需要修改sqlite的源代码,这个工作难度比较大。2.需要对修改后的sqlite进行编译,需要对makefile有所了解,手动编写makefile文件,对源程序进行编译。因平台差异性,可能会造成某个平台无法编译生成动态链接库的可能。3.需要对数据访问层代码进行修改,例如qt平台需要将以前对数据库操作使用的QSqlQuery类,更改为使用sqlite3.h文件中定义操作,对数据库操作。其他平台也一样,都要做这一步的修改。4.在程序编译时,要加入使用加密的动态链接库(linux为共享库.so文件)windows平台最容易,只需将所使用的dll文件到应用程序中即可。其他平台需要实验,看如何引入库,如果编译。需要做的工作:1.修改sqlite源代码,追加对数据库文件进行加密的功能。2.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。3.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。4.进行程序的部署,测试。三、数据库加密原理目前主流的数据库都采用了各种安全措施,主要包括用户认证、访问控制、数据加密存储和数据库操作审计等措施。用户认证:用户或者程序向数据库提供自己的有效身份证明,数据库鉴别用户的身份是否合法,只有合法的用户才能存取数据库中的数据。用户认证是所有安全机制的前提,只有通过认证才能进行授权访问和审计。访问控制:数据库管理系统为不同的用户分配不同的权限,保证用户只能进行授权的访问。目前,一些大型数据库(如Oracle 等)都采用了基于角色的访问控制机制,即为用户授予不同的角色,如db—owner,security administrator 等,不同的角色允许对数据库执行不同的操作。数据库加密:用户认证以及访问控制对访问数据库进行了控制,但攻击者可能会利用操作系统或数据库漏洞,或物理接触计算机,而直接接触数据库系统文件,从而可能绕过身份认证和存取控制而直接窃取或篡改数据库内容。对数据库中的数据进行加密是防范这类威胁的有效手段。数据库操作审计:监视和记录用户对数据库所做的各种操作的安全机制,它记录并存储用户的操作,用于事后分析,以检查导致数据库现状的原因以及提供追踪攻击者的线索。数据库的备份与恢复:当数据库发生不可恢复的故障时,可以将数据库恢复到先前的某个一致性的状态。四、SQLite 加密由于SQLite 是开放源码的,并且在其源码中预留了加密接口,我们可以通过实现其预留的加密接口实现口令认证和数据库加密以完善其加密机制。1.口令认证SQLite 数据库文件是一个普通文本文件,对它的访问首先依赖于文件的访问控制。在此基础上,再增加进一步的口令认证,即在访问数据库时必须提供正确的口令,如果通过认证就可以对数据库执行创建、查询、修改、插入、删除和修改等操作;否则,不允许进一步的访问。2.数据库加密数据库加密有两种方式:1)在数据库管理系(Data Base Management System,DBMS)中实现加密功能,即在从数据库中读数据和向数据库中写数据时执行加解密操作;2)应用层加密,即在应用程序中对数据库的某些字段的值进行加密,DBMS 管理的是加密后的密文。前者与DBMS 结合好,加密方式对用户透明,但增加了DBMS 的负载,并且需要修改DBMS的原始代码;后者则需要应用程序在写入数据前加密,在读出数据后解密,因而会增大应用程序的负载。在此,通过实现SQLite 源码中预留的加密接口,实现DBMS 级的加密。3.使用xxx-tea 算法加密SQLite 数据库微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 – 1)231」(也就是程序中的 0×9E3779B9)。之后TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。在1998 年,Markku-JuhaniSaarinen 给出了一个可有效攻击 Block TEA 算法的代码,但之后很快 David J. Wheeler 和 Roger M.Needham 就给出了 Block TEA 算法的修订版,这个算法被称为 XXTEA。XXTEA 使用跟 Block TEA 相似的结构,但在处理块中每个字时利用了相邻字。它利用一个更复杂的 MX 函数代替了 XTEA 轮循函数,MX 使用 2 个输入量。
❾ 在使用sqlite时有什么需要注意的地方吗
首先介绍我用Sqlite解决的实际问题是什么?问题1:某个功能的数据需要连接一个远程数据库查询速度很慢,查一次数据不容易,希望能够重复利用之前查过的数据集。问题2:非常大的数据量比如几千万甚至几亿条数据,一次性读取到DataTable中,会内存溢出的,所以在第一次分析时就是通过Reader的方式,分析完一条后并不在内存中保存,但是紧接着用户的第二次分析、第三次分析还是要用到的第一次分析的数据,如果我们重新查询一次远程服务器,效率可想而知啊。结合上面的2个问题,为了解决效率问题和数据重复利用度,减少数据库服务器的压力,我才用Sqlite缓存数据(当然这不是唯一也不是最好的解决方案) 。优化SQLiteHelper陆兄的SQLiteHelper类我增加了几个有用的方法:第一个方法是GetSchema,得到某个表的表结构。/// <summary> /// 查询数据库中的所有数据类型信息 /// </summary> /// <returns></returns> public DataTable GetSchema() { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); DataTable data = connection.GetSchema("TABLES"); connection.Close(); //foreach (DataColumn column in data.Columns) //{ // Console.WriteLine(column.ColumnName); //} return data; } }第二个方法是IsTableExist,判断SQLite数据库重某个表是否存在 。/// <summary> /// 判断SQLite数据库表是否存在 /// </summary> /// <param name="dbPath">要创建的SQLite数据库文件路径</param> public bool IsTableExist(string tableName) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); using (SQLiteCommand command = new SQLiteCommand(connection)) { command.CommandText = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + tableName + "'"; int iaaa = Convert.ToInt32(command.ExecuteScalar()); if (Convert.ToInt32(command.ExecuteScalar()) == 0) { return false; } else { return true; } } } }第三个方法是Query,执行查询语句,返回DataSet/// <summary> /// 执行查询语句,返回DataSet /// </summary> /// <param name="SQLString">查询语句</param> /// <returns>DataSet</returns> public DataSet Query(string SQLString) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { DataSet ds = new DataSet(); try { connection.Open(); SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection); command.Fill(ds, "ds"); } catch (System.Data.SQLite.SQLiteException ex) { throw new Exception(ex.Message); } return ds; } }构建缓存对象模型和缓存控制器每一块缓存对象,在数据库中会产生一个表,而表名称是有缓存控制器自动生成的,访问缓存的工作全部交由缓存控制器完成,通过缓存项的ID和MoleKey来访问。在Sqlite中还需要一个系统表来维护每个缓存项和实际缓存存储表之间的对应关系,我们称之为配置表,它将在缓存控制器创建Sqlite缓存数据库文件时创建。配置表共有以下几个字段,分别和缓存对象模型CdlCacheItem类映射:列名称 说明Id 缓存的唯一数字编号MoleKey 缓存模块名称,一个模块可以有多个缓存数据,ID可以区分。实际应用时,某个功能时会经常缓存数据的,所以通过MoleKey就可以得到这个功能所有的缓存列表,然后选定其中的部分缓存来进行使用。Comments 缓存说明TableName 缓存数据存储的数据表名称AddDate 缓存时间戳创建数据库的方法如下:static void CreateDB() { //总共有ID、MoleKey、Comments、AddDate这几列 string sql = "CREATE TABLE SYSCDLTABLES(ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,MODULEKEY VARCHAR(200),COMMENTS VARCHAR(500),TABLENAME VARCHAR(100),ADDDATE DATETIME)"; SQLiteDBHelper.CreateDB(CACHEFILEPATH, sql); }每个缓存项(缓存对象模型)定义如下,和配置表对应:/// <summary> /// 缓存项对象 /// </summary> /// <Author>Tecky Lee</Author> /// <Date>2011-1-11 15:11</Date> public class CdlCacheItem { int m_id; public int Id { get { return m_id; } set { m_id = value; } } string m_moleKey; public string MoleKey { get { return m_moleKey; } set { m_moleKey = value; } } string m_comments; public string Comments { get { return m_comments; } set { m_comments = value; } } string m_tableName; public string TableName { get { return m_tableName; } set { m_tableName = value; } } DateTime m_timestamp; public DateTime Timestamp { get { return m_timestamp; } set { m_timestamp = value; } } }下面是控制器的接口定义:public interface ICdlCacheController { void BeginLoadRow(); void EndLoadRow(); System.Collections.Generic.IList<CdlCacheItem> GetCdlCacheItems(string moleKey); CdlCacheItem GetCdlCacheItems(int id); void LoadRow(System.Data.DataRow row, string tableName); void LoadRow(IEnumerable<object> row, string tableName); string LoadTable(System.Data.DataTable dt, string moleKey, string comments); System.Data.Common.DbDataReader QueryCdlTableReader(CdlCacheItem item); System.Data.DataTable QueryCdlTables(CdlCacheItem item); System.Data.DataTable QueryCdlTables(string sql); void RemoveAllTables(); void RemoveCdlTables(string moleKey); void RemoveCdlTables(System.Collections.Generic.IList<CdlCacheItem> items); void RemoveCdlTables(CdlCacheItem item); void RemoveCdlTables(int id); }上面的函数下面来做个说明:1、BeginLoadRow、LoadRow和EndLoadRow,三个函数组为了在我们查询主数据库时使用Reader方式读取数据时,可以一条条将数据同时存放在缓存中。2、RemoveAllTables和RemoveCdlTables是用来删除缓存项的。3、GetCdlCacheItems,通过moleKey得到多个缓存项。比如用户想基于这几天内保存的某个功能的数据做一次快速分析,那么我们就可以通过这个函数得到缓存列表,由用户选择列表中的一个来继续。4、QueryCdlTableReader,得到某个缓存数据的Reader对象,这样可以一行行的分析,一次读出大数据量的数据到DataTable中,内存可能会溢出的。5、QueryCdlTables,将某个缓存项查询并装载到DataTable中。提高缓存数据写入效率Sqlite在保存数据的时候,比如一次保存一个亿条的数据,一条条插入效率非常低下,网上也有人对其进行讨论。效率低下的主要原因在于IO操作次数过于频繁,所以在LoadTable或者是使用BeginLoadRow·EndLoadRow的时候,使用了事务来减少数据提交的次数,结果保存的效率非常的高,我测试的结果是400万条数据查询,只需要几十秒钟,这点时间相对于重新查一次远程服务器那是可以忽略了。下面给出BeginLoadRow和EndLoadRow的具体代码(只有在EndRow的时候才会提交一次数据):SQLiteConnection m_connection; SQLiteCommand m_command; DbTransaction m_transaction; public void BeginLoadRow() { m_connection = new SQLiteConnection("Data Source=" + CACHEFILEPATH); m_connection.Open(); m_transaction = m_connection.BeginTransaction(); m_command = new SQLiteCommand(m_connection); } public void EndLoadRow() { try { if (m_command != null) m_command.Dispose(); if (m_transaction != null) { m_transaction.Commit(); } if (m_connection != null) { m_connection.Close(); m_connection.Dispose(); } } catch (System.Exception ex) { LogHandle.Error(ex); } }LoadTable函数内部也是调用BeginLoadRow·EndLoadRow模式来完成的。数据库文件如何创建:Sqlite数据库文件如果不存在,在执行sql语句的时候,会自动根据ConnetionString中指定的位置创建数据库文件,默认创建的空数据库只有4K。其他有待讨论的问题:1、我是将所有的缓存做到一个数据库文件中了,实际应用根据业务的不同,可以一份缓存数据一个文件也是很好管理的,维护也方便,资源管理器中就可以拷贝删除等。2、当我们存储一亿条数据到Sqlite的时候,因为Sqlite没有压缩数据,结果数据库文件就可以会有好几个G(这也不一定,适合数据库字段的多少,字段类型有关的)。文件太大就消耗了磁盘空间,而且用户或者程序如果不及时清理的,可能会耗尽磁盘空间。这里就必须建立一个机制,检查sqlite的缓存并及时清理,或者设置缓存应用的上限,当达到上限后自动根据时间戳清理历史缓存。转载
❿ sqlite 零配置 什么意思
sqlite不需要安装,不需要注册类库,只需要一个便准的动态链接库文件sqlite3.dll就可以完成数据管理的全部工作。提供便准的API函数作为接口。