Android数据库无缝升级方案

软件迭代过程中,业务不断更新,也要求软件持续更新。相应地,数据库更新升级也是不可避免的一个环节。Android作为客户端应用,数据库升级相对于服务端来说会麻烦一些。常见的升级方式有:

1.删除旧表和数据,创建新表。优点是简单方便,缺点是丢失了旧数据。适用于应用数据依赖度低的情况。

2.在代码中兼容处理各版本数据库,创建新表,迁移旧数据到新表。优点是保留了旧数据,缺点是需要处理兼容个版本数据库差异,比较麻烦。如果通过代码来记录维护版本差异,会导致代码臃肿且极易出错。

本文介绍一种简单无缝的数据库升级方案,也是属于上述的第二种方式,但是简单、高效地处理了数据库版本兼容。代码已实现在DBFramework中,这是一个轻量的数据库框架,简单、规范、高效,能够很好的处理表之间的继承关系,可以为你节省很多开发工作。

感兴趣的朋友可以了解一下。

数据库升级,其实是对其中的表进行升级。要更新表并且保留数据,这就必须要知道新表和旧表之间的差异。如果我们靠开发人员来记录各版本之间表的差异,无疑是一个困难和繁杂的工作。那么当我们进行数据库的时候,客户端应用有没有办法知道这些差异,知道有哪些表需要更新呢?答案是肯定的。在Sqlite中有一张叫做sqlite_master的系统表,其中记录了sqlite中的所有表信息,如下:

可以看到,其中处理表名,还有表的创建语句。有了创建语句,我们就能解析出表的字段信息,然后对比新表和旧表的字段,有差异则说明表需要更新,反之则不需要更新。更简单的是我们直接用别骂来创建新表,然后直接对比新表和旧表的创建语句(忽略其中的表名),看是否有差异来决定是否更新表。然后再执行具体的更新操作,迁移数据,删除无用的表——旧表,抑或是以别名创建的但是无需更新的新表。

时间: 2024-12-28 18:14:00

Android数据库无缝升级方案的相关文章

android数据库的升级的写法

在基类的table中加入upgrade操作: public abstract class DbBaseTable { private static final String TAG = "DbBaseTable"; /** * @return the DB table name */ abstract String getName(); /** * Creates the DB table according to the DB scheme * * @param db */ abst

Android数据库(sqlite)加密方案

最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加密的字段是要查找数据就变得麻烦. 所以第三种方案就是在内存里解密,在网上查到SQLITE是支持加密的, 所以就根据网上的指导一步步地将SQLITE编译成支持加密的. 那下一步就是怎样做成SDK去方便使用?第一个念头就是将原生的数据库使用方式移植过来,但做起来比开始想像的难了点,但最终也在修修补补中完

ios 数据库更新升级方案

我们常使用fmdb或者其他方式创建sqlite数据库,但是由于版本迭代问题,常常有需求要更新数据库,比如加字段.删除.修改字段等等,怎么样才能升级数据库且保持原来存的数据有效呢,上代码: const static NSInteger FAMILY_LIST_DB_MANAGER_VER = 1; @implementation KSFamilyListDBManager {     DBManager *_dbMgr; } + (instancetype)sharedManager {     

打造android ORM框架opendroid(七)——数据库升级方案

在上一篇博客<打造android ORM框架opendroid(六)--级联查询>我们讲了OpenDroid最后一块功能查询的实现原理.今天我们将进行OpenDroid一个重头戏,也是本系列博客的最后一篇--数据库升级方案. 说道数据库升级,我可是很头疼的, 为什么呢? 因为以前的项目中,根本没有考虑数据库升级方案的问题,就直接drop table了,这样导致的结果就是"以前的数据都消失了".额... 凭空消失确实不是很少的一件事,如果数据不重要还行,重要数据呢? 说消失就

Android 数据库升级完整解决方案

数据库升级的意义 我们在开发Android应用的时候,不可避免地要使用数据库.而数据库的结构在第一版的时候定下来,之后发布功能更新,或增加业务逻辑,原来的数据库结构可能就不适用了.而如果数据库的结构与之前版本的结构不同,新版本的应用读取旧数据库肯定会出问题.解决办法只有两种: 1.让用户卸载老版本再安装新的程序: 2.软件自行更新数据库结构. 第一种办法很明显不具备可操作性,而且用户一旦卸载软件,数据就丢失了,这是不能容忍的事情.因此,作为开发者必须妥善处理数据库的升级问题. 当然了,有的同学会

Android数据库之创建和升级数据库(中)

上一篇文章中,简单介绍了一下android数据库的一些基本概念,那么从本节开始,就实战一下Android数据库的创建和升级. 上文中,也介绍了,SQLiteOpenHelper是一个抽象类,是我们用来创建和升级数据库的最佳实践.下面直接以代码方式,演示一下数据库的创建操作. <span style="font-size:18px;">package com.happy.db.db; import android.content.Context; import android

Android数据库高手秘籍(三)——使用LitePal升级表

在上一篇文章中,我们学习了LitePal的基本用法,体验了使用框架来进行创建表操作的便利.然而大家都知道,创建表只是数据库操作中最基本的一 步而已,我们在一开始创建的表结构,随着需求的变更,到了后期是极有可能需要修改的.因此,升级表的操作对于任何一个项目也是至关重要的,那么今天我们就 一起来学习一下,在Android传统开发当中升级表的方式,以及使用LitePal来进行升级表操作的用法.如果你还没有看过前一篇文章,建议先去参考 一下 Android数据库高手秘籍(二)——创建表和LitePal的

Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())

数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0版本升级到1.1版本时,老的数据不能丢. 那么在1.1版本的程序中就要有地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使用的数据库. 换句话说,要在1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值. 当然有的时候我们对更新后的 版本并没有什么好感,

Android 数据库升级解决方案

转自:http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不一样的,比如V1.0的表A有10个column,而在V1.1的表A有12个colum,在升级时,表A增加了两列,此时我们应该怎么做呢. 总体思路 1,将表A重命名,改了A_temp. 2,创建新表A. 3,将表A_temp的数据插入到表A. 下面代码列出了更新表的实现,upgradeTables,给