关闭

SQLite原理、升级与降级

700人阅读 评论(0) 收藏 举报
分类:

SQLite: https://www.sqlite.org/pragma.html#pragma_page_size

数据库的CRUD,升级表/升级库,合并表/合并库

钱柜娱乐开户 数据库模块搭建方案- https://www.jianshu.com/p/57eb08fe071d
钱柜娱乐开户 数据库开发(一)SQLite3概述- /itachi85/article/details/51649468
  钱柜娱乐开户、iOS等移动操作系统中的数据库实现也是使用的SQLite3。程序库实现了多数的SQL-92标准,包括事务以及实现原子性、一致性、隔离性和持久性,但它缺失了某些特性,例如它仅部分支持触发器: 支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器。尽管它支持大多数复杂查询,但它的ALTER TABLE 功能有所限制:只能添加和重命名列,不能修改或者删除列。因此,当需要修改或者删除列名时只能重新创建表。
SQLite开源库ORMLite或者GreenDao Active钱柜娱乐开户 - https://github.com/greenrobot/greenDAO
IM中使用的是原生数据库SQLite。

> SQLite原理

SQLite前端解析系统,SQLite后端引擎;创建索引,创建视图,创建触发器,drop命令
sqlite的后端系统设计原理- http://www.kubiji.cn/juhe-id6724.html
SQLite剖析(5):体系结构- /zhoudaxia/article/details/8196838
sqlite 视图、触发器、索引和事务总结- /hustyangju/article/details/17488309

 SQLite由以下几个组件组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展SQLite的内核变得更加方便。
 SQLite的存储后端是采用Btree实现,多个连接可以并发操作,但是同一时间只允许一个写着存在。
 sqlite是一个功能相对完整的数据库系统。一个传统的数据库系统大体都可以划分成以下几部分:connector pool(网络层,提供CS模式的数据库访问支持);sql 解析&优化器;数据管理&缓存;存储引擎&虚拟机;文件系统抽象层(OS层,屏蔽各种不同操作系统的API差异)。sqlite除了没有网络层的支持外,整体架构也基于以上的架构。整体上sqlite的功能系统被划分成两部分,即frontend(前端)和backend(后端)。前端实现sql的语法解析,生成sqlite虚拟机支持的中间代码;后端实现sqlite的文件结构、数据组织、存储缓存管理、VDBE虚拟机等功能。
 sqlite前端包括词法分析器、语法分析器与中间代码生成器三部分。
 sqlie内部用pager模块实现整个页管理功能。pager模块介于B+树和OS层之间,提供基于页的数据存储&缓存、锁管理以及日志管理功能。其中锁管理与日志管理结合实现了sqlite的事务支持,而页的存储缓存则提供了统一的读写服务,屏蔽上层调用对磁盘与内存的感知。
  sqlite的页在实际应用中被划分为leaf、internal、overflow及free四种类型的逻辑页。
 sqlite的Pager提供了对页一级的读写、锁、日志等操作。但是并没有实现任何数据库相关的概念(如表、索引、事务等)。
 sqlite的表是由B+树实现的。sqlite选用B–树来实现索引,这样索引占用的内存空间相对更少,容易加载到内存中。B–树和B+树都是多路平衡搜索树。
 sql的后端最上层就是sqlite的虚拟机VDBE(virtual database engine)[4]。VDBE是sqlite前端和后端的桥梁,sqlite的核心运行过程都是在VDBE中实现的。一个VDBE对象包括以下数据:
  ∙ 一个由sql解析器生成的字节码
  ∙ 查询column的名称和数据类型
  ∙ 输入参数值
  ∙ 程序计数器

> SQLiteException: no such table(GreenDao),SQLite创建表与更新表与版本号的联系??

SQLite版本号升级时,会执行DatabaseOpenHelper的onCreate()??

App版本更新时对SQLite数据库表的修改问题- /u013067184/article/details/48031081
SQLiteException: table TAREAS has no column - https://stackoverflow.com/questions/36308339/greendao-钱柜娱乐开户-database-sqlite-sqliteexception-table-tareas-has-no-column-na , https://stackoverflow.com/questions/934237/sqlite-exception-no-such-table-error

版本更新时,sqlite表结构发生变化了该怎样处理,最有效的方案就是先删除老的数据,重新调用onCreate(db);
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  context.deleteDatabase(DB_NAME);
  onCreate(db);
}

GreenDaoUpgradeHelper-https://github.com/yuweiguocn/GreenDaoUpgradeHelper

钱柜娱乐开户 SQLite数据库版本升级原理解析- http://www.cnblogs.com/liqw/p/4264925.html
App版本更新时对SQLite数据库表的修改问题- /u013067184/article/details/48031081
钱柜娱乐开户 SQLite数据库的数据升级与降级- http://www.cnblogs.com/zhaoyucong/p/6118226.html
主要的三个方法:
onCreate()该方法是在你没有安装过(第一次运行)的时候执行,这时可以在这个函数中完成初始的数据表的创建
onUpgrade()该方法是在你安装过的情况下,对数据继续更新的时候执行,这时可以在这个函数完成数据库版本升级带来的旧版本的兼容问题,以及数据迁移问题。
onDowngrade()该方法是在现逆向降级(如应用由版本号4降级安装版本号为3的包)时必须重写的方法,如果应用降级覆盖安装时没有重写该方法则会崩溃。

onCreate:调用时机是用户首次安装应用后启动,或是清除App数据库文件后启动。这时可以在这个函数中完成初始的数据表的创建。
onUpgrade:调用时机是用户在做应用更新,覆盖安装后启动,如果新版本中数据库版本号要比旧版本中的数据库版本号高则会调用。这时可以在这个函数完成数据库版本升级带来的旧版本的兼容问题,以及数据迁移问题。

因为有的用户手机上本来就有第一版本的APP,所以在App升级到第二版本时会执行onUpgrade(),不会执行onCreate()。

--------------------------------

> SQLite数据库的库也可能会损坏?数据库损坏与修复
钱柜娱乐开户的Romm是钱柜娱乐开户官方整合出来的一揽子ORM数据库解决方案。
using Room instead of SQLite- https://developer.钱柜娱乐开户.com/topic/libraries/architecture/adding-components.html
  Room在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时使流畅的数据库访问。
https://github.com/googlesamples/钱柜娱乐开户-architecture-components/tree/master/PersistenceMigrationsSample


SQLite官网- http://www.sqlite.org/howtocorrupt.html
微信 SQLite 数据库修复实践- https://www.qcloud.com/community/article/764092,https://zhuanlan.zhihu.com/p/26697193
微信 iOS SQLite 源码优化实践- https://www.qcloud.com/community/article/671906

  SQLite 损坏的原因:
文件错写;文件锁 bug;文件 sync 失败;设备损坏;内存覆盖;操作系统 bug;SQLite bug;
  移动端数据库损坏的真正原因其实就3个:
空间不足;设备断电;文件 sync 失败;(文件覆盖问题、文件锁问题、数据同步问题、内存问题)

 首先我们来看 SQLite 的架构。SQLite 使用 B+树 存储一个表,整个 SQLite 数据库就是这些 B+树 组成的森林。对于每个表的元数据(表名、根节点地址、表 scheme 等),都记录在一个叫 sql_master 的表中。这个 sql_master 表(下简称 master 表) 本身也是一个 B+树 存储的普通表。

 SQLite是一个适配不同平台的数据库,不仅支持多线程并发,还支持多进程并发。它的核心逻辑可以分为两部分:
  Core层。包括了接口层、编译器和虚拟机。通过接口传入SQL语句,由编译器编译SQL生成虚拟机的操作码opcode。而虚拟机是基于生成的操作码,控制Backend的行为。
  Backend层。由B-Tree、Pager、OS三部分组成,实现了数据库的存取数据的主要逻辑。
  SQLite算是非常稳定的数据库,不容易出现损坏,就算应用程序崩溃,或者操作系统崩溃,甚至是执行事务时出现断电,都能在下一次使用数据库时自动修复。但是,还是不能避免不出现损坏的情况。

SQLite使用建议:
1. 减少多进程或多线程操作,尽可能单线程写。2. 减少事务操作,减小事务复杂度,减少检查点3. 减少数据库的大小4. 避免使用PRAGMA synchronous=OFF

断电不会由于SQLite写事务对数据库文件造成损坏,其实现机制就是利用了事务+日志机制,想具体了解就看hot journal或者Write-Ahead Log部分?
当磁盘空间写满或写入了格式不正确的数据或在操作db过程中内存溢出,那么.db文件的镜像就会被破坏,这种情况下再去执行有关此db的操作,钱柜娱乐开户就会把该db文件删除掉,如果db文件损坏了,可在adb shell下恢复其数据,做法如下:
sqlite3 old.db(注:损坏的db文件)
.output tmp.sql
.dump
.quit
然后读取数据到新的db
sqlite3 new.db
.read tmp.sql
.quit
不过保险起见还是做好db的备份,因为一旦db文件损坏,在未知的情况下再去操作此db,钱柜娱乐开户就会直接把此db给干掉

关于sqlite断电或者存储空间不足造成的数据文件损坏问题- /xp5xp6/article/details/50531364
sqlite 数据库性能调优- /bravegogo/article/details/53517610

>SQLite频繁读与写 打开与关闭
  钱柜娱乐开户中无法避免操作SQLite数据库,并且大家的一贯做法都是维系一个全局的单例句柄,保持SQLiteDatabase数据库句柄出于打开状态,避免多次打开耗时。SQLiteDatabase的读、写句柄,关闭连接句柄。SQLite实际是支持多线程(几乎)无锁地并发操作。
钱柜娱乐开户 Sqlite常见异常:连接池关闭问题- https://zhuanlan.zhihu.com/p/27236021
钱柜娱乐开户 Sqlite多线程访问异常解决方案- https://www.cnblogs.com/wangmars/p/4530670.html
钱柜娱乐开户之存储篇_SQLite数据库_让你彻底学会SQLite的使用- https://www.cnblogs.com/jingmo0319/p/5591234.html

0
0
查看评论
发表评论
* 以上用户言论只代表其个人钱柜娱乐开户,不代表CSDN网站的钱柜娱乐开户或立场

钱柜娱乐开户版本更新时对SQLite数据库升级或者降级遇到的问题

SQLite是钱柜娱乐开户内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类。我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定...
  • jie1991liu
  • jie1991liu
  • 2015-12-17 12:11
  • 5760

钱柜娱乐开户版本更新时对SQLite数据库升级或者降级遇到的问题

SQLite是钱柜娱乐开户内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类。我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定...
  • jie1991liu
  • jie1991liu
  • 2015-12-17 12:11
  • 5760

钱柜娱乐开户中sqlite数据库升级方案

钱柜娱乐开户开发中,如果大家使用到了sqlite就会牵涉到它的升级问题,因为升级后的表结构可能完全不一样,会有字段的添加或者删除等。。    sqlite升级思路:      1:将表A重新命名...
  • yaya_soft
  • yaya_soft
  • 2013-12-03 08:39
  • 16173

Dubbo学习(七):服务的升级和降级

1.开关          先讲一下开关的由来,例如京东在6月18日做店庆促销活动,在交易下单环节,可能需要调用A、B、C三个接口来完成,但是其实A和B是必须的,C只是附加的功能(例如在下单的时候做...
  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2016-03-31 16:40
  • 8865

App版本更新时对SQLite数据库升级或者降级遇到的问题

SQLite是钱柜娱乐开户内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类。我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定...
  • jdsjlzx
  • jdsjlzx
  • 2016-02-17 20:53
  • 1957

App版本更新时对SQLite数据库升级或者降级遇到的问题

本文出自:http://www.pedant.cn/2014/08/01/sqliteopenhelper-onupgrade-ondowngrade-handle/ App版本更新时对SQLi...
  • u011549998
  • u011549998
  • 2016-03-24 21:47
  • 245

App版本更新时对SQLite数据库升级或者降级遇到的问题

SQLite是钱柜娱乐开户内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类。我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定...
  • shen424626154
  • shen424626154
  • 2015-02-27 14:47
  • 244

钱柜娱乐开户版本更新时对SQLite数据库升级或者降级遇到的问题

SQLite是钱柜娱乐开户内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类。我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定...
  • qq_32059827
  • qq_32059827
  • 2016-06-08 10:41
  • 4899

App版本更新时对SQLite数据库升级或者降级遇到的问题

SQLite是钱柜娱乐开户内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类。我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定...
  • qq_21051503
  • qq_21051503
  • 2016-01-21 11:35
  • 405

App版本更新时对SQLite数据库升级或者降级遇到的问题

App版本更新时对SQLite数据库升级或者降级遇到的问题 SQLite是钱柜娱乐开户内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问...
  • licong0716
  • licong0716
  • 2016-04-05 10:29
  • 203
    个人资料
    • 访问:635214次
    • 积分:10690
    • 等级:
    • 排名:第1801名
    • 原创:160篇
    • 转载:508篇
    • 译文:180篇
    • 评论:29条
    最新评论