`
backspace
  • 浏览: 137191 次
文章分类
社区版块
存档分类
最新评论

使用SQLite的感想

 
阅读更多

最近都在使用SQLite数据库,老实说这才是我使用的第三款数据库而已。使用它原因就应为它够轻量,而且性能挺不错。但使用久了也发现了一些问题。偶尔也会有怨言,但也不会骂SQLite是个破东西之类的,原因又几个:对SQLite的了解不过透彻,使用方式上总有些不妥;自己的资历尚浅,解决问题的能力有限;自己也没本事写出比SQLite更好的数据库。

在网上看了一下SQLite的适用场景。100000次/天访问量的网站,嵌入式设备和应用软件,应用程序文件格式等。但是读数据可时也会抛锁表的异常,SQLite的锁是粗粒度,这个对异常的处理不知如何是好;还有的就是数据库的损坏。Database disk image is malformed。网上说数据库造成数据库损坏的原因有三个

  1. sqlite数据库在写入时断电等,导致数据库里的结果被破坏。
  2. sqlite数据库所存的磁盘空间不够。
  3. 磁盘有坏磁道等

之前数据库的损坏估计是第一种原因。而当时又没有对数据进行什么备份。只能人工用.dump命令从损坏的数据库中把数据导出来。这个顺带也讲一下吧

在SQLite的命令模式中打开数据库,依次输入一下命令

sqlite> .mode insert
sqlite> .output test.sql
sqlite> .dump
sqlite> .exit  

当然不一定要”.exit”命令,按“Ctrl+C”或直接关掉都行,导出的文件名“test.sql”随个人喜好。

或者用这个命令更好

sqlite3.exe dbname.db .dump>fileName.sql

这个命令导出的SQL会比上面那个要工整。

无论哪一种导出的SQL,如果数据库有问题的,导出的SQL里面会有这行

/**** ERROR: (11) database disk image is malformed *****/

最后也只能回滚事务RollBack。

要是想用回这些数据的话,把回滚事务改掉,把那句ERROR的删掉。

然后就是导入数据

sqlite3.exe newDBName.db
sqlite> .read test.sql
sqlite> .exit

今后就打算对SQLite定期进行备份,备份的方式也只是单纯的文件IO操作——Copy一份呗。在读写数据库时万一抛出Database disk image is malformed异常时就认为数据库已经损坏了,马上换上备份的数据库。

还有在写数据库的时候,在对数据库里多条记录进行操作的时候,对多个表的数据操作的时候用事务包起来,那么在写入数据库的时候,在数据库文件相同的目录下会产生一个文件名格式为: 数据库文件名 + "-journal"的文件。该文件在事物提交或回滚后将被立刻删除,不过听说在Android下,这个文件没被删除,只是以一个0B大小的文件存在。在事物运行期间,如果当前主机因电源故障而宕机,而此时由于回滚日志文件已经保存在磁盘上,那么当下一次程序启动时,SQLite在打开数据库文件的过程中将会发现该临时文件的存在,SQLite会在成功打开数据库之前先基于该文件完成数据库的恢复工作,以保证数据库的数据回复到上一个事物开始之前的状态。这样虽然不能避免数据库的损坏,但是能保证数据状态的一致性。

由于资历和认识尚浅,以上说错的还请各位指出,若各位有什么好门路的,也恳请指引一下。谢谢!

3
6
分享到:
评论
1 楼 gfdice 2013-07-04  
我们项目是用事务包起来防止断电或者进程突然死掉的问题的,当然了,我们是做桌面应用的,可能不大一样。

相关推荐

    sqlite3-心得

    使用sqlite3更新数据库文件,以前是自己通过组织命令,进行table表的增删改等操作,但是最近几年NDS数据库和sqlite官方合作,可以通过RBU进行差分更新了。但是更新过程中也有一些注意事项。

    winform + sqlite数据库 + EntityFramework ORM框架

    7、在入口文件方法内,使用GetItemCollection方法进行EF暖机操作,以避免第一次度数据库过慢,不过这个方法是否有效需要自行感受,数据库越复杂可能感受越明显。 8、需要NuGet引入EntityFramework、System.Data....

    SQLcipher2.1,SQLite数据库管理工具

    SQLcipher的核心功能在于数据加密,它通过使用标准的AES(高级加密标准)算法,对SQLite数据库进行透明加密。当数据库被SQLcipher加密后,只有拥有正确密钥的用户才能访问数据,这极大地增强了数据的保密性。...

    新人日记20200430 关于利用python读取SQLite3的心得感受

    当使用Python处理SQLite3数据库时,我们通常会使用pandas库来方便地读取和操作数据。然而,从SQLite3数据库读取数据到DataFrame时,可能会遇到一些格式问题,比如数据类型不匹配、空值处理以及特定字符串与缺失值的...

    天狼星淘宝客V2.1

    1. 数据存储:天狼星淘宝客V2.1使用SQLite存储用户的推广链接、订单信息、佣金记录等关键数据。通过结构化的数据库设计,使得数据检索、更新和备份变得更加高效和安全。 2. 数据分析:SQLite支持SQL查询语言,使得...

    使用Ionic2制作移动应用

    ### 使用Ionic2制作移动应用 #### 一、Ionic2基础知识概览 Ionic2是一个开源的框架,用于构建高性能的跨平台移动应用。它基于Angular2+ 和 Cordova/PhoneGap,利用HTML、CSS和JavaScript来开发原生感受的应用。本...

    JournalApp:这个Android应用程式可让使用者写下自己的想法和感受

    JournalApp 这个Android应用程式可... 它是使用Android / Java和SQLite数据库作为存储后端构建的。 该项目已获得GNU GPLv3的许可。 MVP的实现是根据Udacity的Android Lesson注释完成的。 Google登录使用示例代码来实现

    LINQPad 5.25.00 高级版(自动完成,代码格式化)

    LINQPad 也是一个很好的学习LINQ的工具,包含《C# 3.0 in a Nutshell》一书中200个示例,可以使用LINQPad感受LINQ的超酷功能和函数编程。 编写一条简单的查询语句,可以立即看到查询的结果,在此测试是编写的LINQ...

    akcms.tar.gz_300

    针对SQLite数据库启用了事务,大幅提高写操作速度,感受最明显的就是大量写数据的操作,如:在开发机上安装速度提升10倍以上,导入数据速度提升300倍以上,最常用的新建文章等操作的速度也有提升不过感觉不明显。...

    Android 图书书架源码

    在Android开发中,创建一个图书书架的界面可以极大地提升用户体验,让用户感受到如同实体书架般的浏览乐趣。本文将深入探讨如何使用Android技术实现“图书书架”源码的构建,涉及的关键知识点包括UI设计、数据存储、...

    作业登录系统(使用C#编程)

    这意味着在设计时,开发者不仅考虑了系统的功能性,还考虑到了用户体验,通过良好的交互设计和视觉设计来提升用户的使用感受。在C#中,可以利用Windows Presentation Foundation (WPF) 或者Windows Forms框架来构建...

    看图猜成语程序使用说明-爬虫

    《看图猜成语程序使用说明-爬虫》 在当今数字化时代,利用计算机技术解析和处理数据已经成为...通过合理地整合这些知识点,我们可以创建出一款既有趣又有教育意义的程序,让更多人通过互动的方式感受中国成语的魅力。

    安卓课程设计汇本报告.doc

    5) 实现数据存取功能,可能包括使用SQLite数据库存储用户信息。 6) 测试应用,确保功能完整且运行流畅。 6 程序实现及代码分析 课程设计的具体实现包括创建用户输入界面,接收并处理输入数据,调用合适的算法计算...

    我的日记本

    考虑到日记应用的特点,"MyDiary"可能会使用SQLite数据库来存储用户的日记条目,每条日记作为一个记录,包含日期、标题和内容等字段。这样做的好处是数据持久化,即使应用关闭再打开,也能快速恢复用户的日记列表。 ...

    Android应用源码之高仿生日管家.zip

    最后,考虑到用户体验,应用可能使用了Material Design指南来创建符合Google设计规范的界面,包括色彩、图标、过渡动画等,提升应用的整体视觉感受。 总之,这个“Android应用源码之高仿生日管家”项目涵盖了...

    特手天气预报

    描述中反复提及的“可实现天气查询,优美的布局”,暗示该应用不仅具备基本的天气信息查询功能,还注重用户体验,通过美观的界面设计来提升用户的使用感受。 在标签中,“天气”和“Android”是关键词。这表明这款...

    Android新闻客户端源码UI.zip

    在Android开发中,UI(用户界面)是至关重要的组成部分,它直接影响到用户的使用感受和应用程序的流行程度。源码分析可以从以下几个关键知识点入手: 1. **布局设计**:Android中通常使用XML文件来定义布局,如`...

    毕业设计&课设--给女票做的408答题小程序的后端,使用Python的Flask设计,毕业设计后端程序 - 是一个题.zip

    2. 题库管理:存储和管理题目,可能包括题目的类型(选择题、填空题、判断题等)、内容、答案等信息,这可能需要用到数据库,如SQLite或MySQL。 3. 题目获取:后端需要根据请求随机或者按特定顺序返回题目给前端。 4...

    JournalApp:Android Journal Application可让用户降低想法和感受

    在Android平台上,开发者通常会使用SQLite数据库来存储用户的数据,如日记条目。SQLite是轻量级的关系型数据库,它支持基本的SQL操作,适合在移动设备上本地存储数据。在JournalApp中,每个日记条目可能包括日期、...

    安卓智能聊天机器人

    因为用户可能希望在关闭应用后仍能保留聊天记录,所以开发者可能会使用SQLite数据库或SharedPreferences来存储这些数据。如果数据量较大,也可以考虑使用云存储服务。 最后,安全性和隐私保护也是重要的一环。在...

Global site tag (gtag.js) - Google Analytics