sqlite是一个比较小巧的数据库,最大的好处就是无安装嵌入式,文档和资料也比较多(我早期做windows应用开发使用access作为数据库,资料太难查了),当然功能也远没有MysqL等高级数据库强大,下面就我平时使用过程中总结一些用法。
内容会持续更新,从今天开始以后尽量将总结放到博客而不是本地笔记。
由于每个sqlite数据都是一个文件,直接查询文件大小也可以(我没试过),不过推荐用sqlite内置的sql语句查询,sqlite支持以下2条语句:
PRAGMA page_size; 查询页大小
上面2个语句直接执行sql即可,返回的是64位整数,2个相乘就是当前db文件的大小,一般来说页大小是固定的,实在sqlite编译期间就指定好了,变化的是页数量。
数据库删除数据后容量并不会释放,我用过的sqlite,access,MysqL,sqlserver都是这样,在sqlite中,如果想释放空间,则执行:VACUUM; 语句即可,执行时间根据数据库当前容量而定,这里做好处理,其实sqlite也并不是释放容量,而是重新创建一个并将原来的数据导入后删除原来的文件。
3.sqlite多线程问题
当然,多线程其实和sqlite并没有关系,sqlite的规则很简单:只允许一个插入,允许多个读取。作为一个简单的嵌入式数据库,做到这样就可以了,做多了反而将事情弄复杂了。但是在项目中免不了多对象插入,这个时候怎么办呢?下面谈谈我自己的几个处理方法
3.1 建立一个主数据库文件main.db,用来存储一些数据量不大的关系数据
3.2 对于多对象的大数据量存储,每个对象用一个数据文件保存,数据库文件文件名称用该对象的id(比如在main.db中存储该对象的自增id)
3.3 对于实在需要多个对象插入同一个表格,可以自己在程序里面实现一个插入队列来排队插入,实现的时候可以用生产者-消费者模型或者 消息循环都行
3.4 有时候3.2 3.3可以结合使用,比如一个对象有很多数据,但是其实真正需要做相互关系比较或统计的数据其实只有几个,这样可以再单独讲这个几个数据用3.3的方法保存,其他不是很重要的数据则不用
3.5 尽量将所有的关系型数据放到3.1的main.db数据库中,保证该数据库不会太大(如果真的太大,你该考虑用MysqL之类的高级数据库了,任何东西都有使用场景的),该数据库的所有操作都放到ui线程中,该数据库支持各种级联查询,外键等。
以上是我的一些想法,不对的地方恳请指教!
4.sqlite的一些基本工具推荐
管理工具:Navicat for sqlite,这是我用过最好的管理工具,比网上推荐其他工具都好,可以去 下载吧 下载
命令行工具:这个没的说,直接用sqlite官网的工具
5.关于ORM
现在看到网上有很多sqlite的ORM工具,我真怀疑这个工具的合理性,sqlite本身是在一些简单场景使用的,就我目前所知,不管是.net,java,android,qt,提供的接口已经够用了,只要再根据业务稍微封装下就好了,完全没必要再搞个反射的ORM框架,当然,这些都是我个人意见。