apk升级Sqlite数据库的升级及之前数据的保留

总结一下oncreate()和onUpdate()调用过程。
1.如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后会调用oncreate()方法,在该方法中一般需要创建表、视图等组件。在创建前数据库一般是空的,因此不需要先删除数据库中相关的组件。
2.如果数据库文件存在,并且当前版本号高于上次创建或升级的版本号,SQLiteOpenHelper会调用onUpdate()方法,调用该方法后会更新数据库的版本号。在onupdate()方法中除了创建表、视图等组件外,还需要先删除这些相关的组件,因此,在调用onupdate()方法前,数据库是存在的,里面还原许多数据库组建。
综合上述两点,可以得出一个结论。如果数据库文件不存在,只有oncreate()被调用(该方法在创建数据库时被调用一次)。如果数据库文件存在,会调用onupdate()方法升级数据库,并更新版本号.

 

做Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了。 SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。
并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:
1   ALTER   TABLE  Subscription  ADD   COLUMN  Activation BLOB;
2   ALTER   TABLE  Subscription  ADD   COLUMN   Key  BLOB;


  另外,如果遇到复杂的修改操作,比如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。
  1. 将表名改为临时表
         ALTER   TABLE  Subscription RENAME  TO  __temp__Subscription;

  2. 创建新表
        CREATE   TABLE  Subscription (OrderId  VARCHAR ( 32 )  PRIMARY   KEY  ,UserName  VARCHAR ( 32 )  NOT   NULL  ,ProductId  VARCHAR ( 16 )  NOT   NULL );
  
      3. 导入数据  
         INSERT   INTO  Subscription  SELECT  OrderId, “”, ProductId  FROM  __temp__Subscription;
  或者  
        INSERT   INTO  Subscription()  SELECT  OrderId, “”, ProductId  FROM  __temp__Subscription;
   * 注意 双引号”” 是用来补充原来不存在的数据的
  
      4. 删除临时表  
        DROP   TABLE  __temp__Subscription;

  通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会应为升级而流失。
  当然,如果遇到减少字段的情况,也可以通过创建临时表的方式来实现。
 
 

Android版本升级同时Sqlite数据库的升级及之前数据的保留

 

在android应用程序需要升级时,如果之前的数据库表结构发生了变化或者新添加了表,就需要对数据库进行升级,并保留原来的数据库数据。

 程序如何知道数据库需要升级?

SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号。比如在软件1.0版本中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。

到了1.1版本,我们的数据库需要发生变化,那么我们1.1版本的程序中就要使用一个大于1的整数来构造SQLiteOpenHelper类,用于访问新的数据库,比如2。

当我们的1.1新程序读取1.0版本的老数据库时,就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。

何时触发数据库升级?如何升级?

当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。根据上述场景,在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。

新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。

升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。

下面举例写出具体过程:

如果我上一个版本的数据库表结构没发生变化,但是新增了两张表,而且之前有一张表中默认有4条数据,现在新版本默认有11条数据,那么该怎么操作呢,假设表A发生了变化,并且新建了表B、C

1.首先我们需要把原来的数据库表重命名一下

public static final String TEMP_SQL_CREATE_TABLE_SUBSCRIBE = "alter table "
            + A + " rename to temp_A";

原来的表结构是:

private static final String SQL_CREATE_TABLE_SUBSCRIBE = "create table  if not exists "
            + A + "(id integer primary key autoincrement,code text not null,name text,username text)";

2.然后把备份表temp_A中的数据copy到新创建的数据库表A中,这个表A没发生结构上的变化

public static final String INSERT_SUBSCRIBE = "select 'insert into A (code,name,username,tablename) 
values ('''||code||''','''||name||''',''cnki'','''||tablename||'''')' as insertSQL from temp_A";

 

3.此时临时表中的数据已经全部复制到了表A中,但是我之前的表A中有四条默认的数据,用户可能删了,可能又增加了新的数据,那我不管用户什么操作,我都把这4条删除掉,然后重新添加一次,这样就保证了之前的四条数据还在新的数据表中。

这是我之前的四条数据,我先找出来:

public static final String[] arrWhereAct = {
            "where code ='K174' and tablename = 'phonepaper'",
            "where code ='GMRB' and tablename = 'newspaper'",
            "where code ='XJSJ' and tablename = 'magazine'",
            "where code ='JTKL' and tablename = 'magazine'" };

 

4.删除备份表

public static final String DELETE_TEMP_SUBSCRIBE = "delete from temp_A ";
    public static final String DROP_TEMP_SUBSCRIBE = "drop table if exists temp_A";

5.然后把数据库版本号改为比之前高的版本号,在OnUpgrade方法中执行上述语句就行,具体如下:

 

@Override

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        

        for (int j = oldVersion; j <= newVersion; j++) {

            switch (j) {

            case 2:

          //创建临时表

                db.execSQL(TEMP_SQL_CREATE_TABLE_SUBSCRIBE);

          //执行OnCreate方法,这个方法中放的是表的初始化操作工作,比如创建新表之类的

                onCreate(db);

          //删除之前的表里面的那4条默认的数据

                for (int i = 0; i < arrWhereAct.length; i++) {

                    db.execSQL(DELETE_TEMP_SUBSCRIBE + arrWhereAct[i]);

                }

               //将临时表中的数据放入表A 

         Cursor cursor = db.rawQuery(INSERT_SUBSCRIBE, null);

                if (cursor.moveToFirst()) {

                    do {

                        db.execSQL(cursor.getString(cursor

                                .getColumnIndex("insertSQL")));

                    } while (cursor.moveToNext());

                }

                cursor.close();

          //将临时表删除掉

                db.execSQL(DROP_TEMP_SUBSCRIBE);

 

                break;

 

            default:

                break;

            }

        }

 

    }

 

为什么要在方法里写for循环,主要是考虑到夸版本升级,比如有的用户一直不升级版本,数据库版本号一直是1,而客户端最新版本其实对应的数据库版本已经是4了,那么我中途可能对数据库做了很多修改,通过这个for循环,可以迭代升级,不会发生错误。

Android SQLite数据库——数据库创建及升级 android开发 阅读详情

相关推荐

深入探究贝叶斯网络(Bayesian Network):从基础原理到实际应用

贝叶斯网络,也称为信念网络或有向无环图模型,是一种概率图模型。它使用有向无环图(DAG)来表示随机变量之间的条件依赖关系。每个节点代表一个随机变量,边表示变量之间的条件依赖关系。贝叶斯网络作为一种强大的工具,通过结合概率论和图论,为复杂系统建模和推理提供了有效手段。无论是在医学诊断、故障检测还是自然语言处理等领域,它都展示了巨大的潜力。然而,其计算复杂度高、结构学习困难等挑战也需要我们在实际应用中不断优化算法和技术。希望通过本文,你能对贝叶斯网络有更深入的理解,并能够在实际项目中灵活应用这一强大工具。

qq_28791753的博客 5971

Android数据库更新并保留原来数据

思路很简单,只需要把原来table中的数据转移就好 我们来看实现 @Override private String createTableBook="create table Book(id integer primary key autoincrement,author text,price real,pages integer,name text)"; private String...

HughZhao的博客 1121

CentOS7.9 安装 ImageMagick,图片转换为HEIC图像格式

由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,在网上找了很多资料,归纳总结并写此文章记录一下。在Linux(CentOS7.9)上安装ImageMagick7.1.1-38。

shmily_i的博客 1940

在 Android Studio 上实时调试数据库( SQLite )

SQLScout 安装 SQLScout 是一个 Android Studio 的插件,通过点击: Setting —&amp;gt; Plugings —&amp;gt; Browse Repositories 搜索 SQLScout 安装即可。 要是下载不动,可以到 这里 下载,然后点击 Install plugin from disk 导入。 加载 成功安装后重启 Andro...

萨达哈鲁的博客 4396

rk3566-11.0新增device分区

1.增加块设备 2.修改根目录节点权限 3.开机启动自动挂载 增加块设备 1.修改parameter.txt文件,新增块设备大小及命名 device/rockchip/rk356x/rk3566_r/parameter.txt FIRMWARE_VER: 11.0 MACHINE_MODEL: rk3566_r MACHINE_ID: 007 MANUFACTURER: rockchip MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE

weixin_51115260的博客 3384

OpenManus本地部署实战:从源码编译到浏览器路径优化全解析

本文详细解析了OpenManus本地部署的全过程,从源码编译到浏览器路径优化。涵盖环境准备、源码获取、模型配置、依赖安装等关键步骤,特别针对Windows系统下的chrome.exe路径修改提供了实用解决方案,帮助开发者高效完成部署并优化性能。

weixin_28826545的博客 381

Android Sqlite数据库跨版本升级 保存之前数据

Android 中SQLiteOpenHelper 的一个抽象函数 onUpgrade(SQLiteDatabase db,int oldVersion ,int newVersion)数据库版本不断地迭代升级,根据oldVersion进行一些数据库方面的操作优点: 1. 因为当前版本已经确定,如果使用newVersion版本进行比较没有意义,完全可以硬编码。所以使用oldVersion与指定数

薛瑄的博客 5020

图解ADAS电源系统架构:看懂这张图,搞懂前装摄像头的供电秘密!

别以为ADAS系统就是“摄像头 + SoC”,其实最难搞的是供电系统,尤其是要满足车规级ASIL-D安全等级时。供电时序、电压稳定性、电源监控、冗余通信链路,一个都不能少。😤一旦电源选型不对,轻则系统卡顿,重则全车失控,不是闹着玩的。

weixin_43199439的博客 674

Android进入SQLite数据库(四种方案)

文章目录打开SQLite数据库的:方式一:在Android Studio中方式二:cmd中方式三:利用谷歌浏览器附加: 打开SQLite数据库的: 方式一:在Android Studio中 1.先启动自己的项目然后在Android Studio底部打开Terminal 2、adb shell远程来连接到手机系统 adb shell 结果: generic_x86:/ $ 3、简单查看一下文件夹 ls 结果: ls: ./init.zygote32.rc: Permission denie

shiqifei的博客 1万+

ANPC三电平拓扑双脉冲试验的原理与实施

ANPC三电平拓扑因损耗低、谐波小、应力均衡而广泛应用,但其存在短、长两类换流通道,寄生电感和开关应力差异显著。短通道尖峰小、可靠性高;长通道应力严苛。因此需分别制定两套独立双脉冲测试方案,针对不同时段和器件(如T1、T5、T6、T4及对应二极管)全面考核开关特性。

嵌入式老牛的博客 350

Android功耗系列专题理论之二十一:Power Monitor测功耗详细说明和注意事项

本文详细介绍了PowerMonitor手机功耗测试仪的功能与使用方法。该设备通过硬件连接替代手机电池,实时监测电流、电压等参数,适用于研发测试、软件优化等场景。文章包含设备接线说明(电源、USB、手机供电等接口)、驱动安装步骤及常见问题排查,并详细讲解了功耗测量操作流程,包括电压设置、开机步骤、数据采集与导出方法。特别强调了测量注意事项,如固定屏幕亮度、关闭后台应用、确保稳定连接等,以确保测试数据准确性。最后提供了简易测量步骤和详细测量流程指导。

596

Android Studio下SQLite数据库的配置与使用(完)

一,AS开发app用,所用的数据库有限制,必须使用较小的SQLite(MySql和Sql Server想想就不显示)   但是该数据库并不需要我们单独下载,安装的SDK中已经有了,在C:\AndroidSDK\platform-tools目录下     最下面一个exe文件就是,双击可以打开dos界面进行编写 将上述讲的SQLite的目录(C:\AndroidSDK\platfor...

weixin_30580341的博客 1392

华为OD机试 - 开源项目热度榜单(Java 2025 C卷 100分)

H = Wwatch X#watch + Wstar X#star +Wfork X#fork +Wissue X#issue +Wmr X#mr H表示热度值,Wwatch、Wstar、Wfork、Wissue、Wmr分别表示5个统计维度的权重,#watch、#star、#fork、#issue、#mr分别表示5个统计维度的统计值。

学Java,找哪吒 1756

Android Studio SQLite数据库应用(一)

Android Studio SQLite数据库应用(一) 版本:Android Studio 1.5.1 创建数据库 升级数据库 CRUD数据操作 SQLite (英语发音:/ˌɛskjuːɛlˈlaɪt/2 or 英语发音:/ˈsiːkwəl.laɪt/3)是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程序库中。与许多其它数据库管理系统不同,SQLite不是一个

Scott-fu的博客 6万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android sqlite数据库升级

随着我们系统的升级,数据库一般也要跟着一起变化。Android 中的 SQLite数据库根据数据库版本号来判断是否进行了升级。当数据库版本号发生变化后,Android 系统会调用 SQLiteOpenHelper 的 ouUpgrade 函数,然后我们在该函数中对版本号进行判断,再根据版本号执行对应的升级数据库的 SQL 语句。 数据库升级主要是调用SQLiteOpenHelper 中的onU...

qq_36699930的博客 1373

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android SQLite 数据库不丢失数据自动升级流程

正常我们在开发中经常会遇到sqlite数据库升级的问题,比如增加字段/删除字段/表结构重构等等,随着apk版本的升高,不同版本可能需要对数据库进行修改,但是要求是数据库升级不能影响用户的已存数据,所以今天就来看看数据库升级流程是怎样的。 目录 SQLiteDatabase源码调用流程 数据库自动升级流程 SQLiteDatabase源码调用流程 首先我们需要继承 SQ...

王项雨 的博客 1822

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android 读取apk的数据库,android 对apk中已经存在的数据库操作

首先需要将数据库文件复制到/data/data/(apk包名)/databases目录下,然后再进行操作import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import com.apk包名.R;import android.content...

weixin_36244175的博客 989

Android Sqlite数据库详解

在整理ContentProvider是知识点之前要先整理Sqlite数据库的知识,因为ContentProvider中要使用到数据库。 步入正题:Sqlite是起源是一艘军舰上,一个数据库程序员觉得潜艇正在使用的数据库太强大的,每次更新升级操作复杂,耗时,效率不高。然后就想优化,目标就是设计出一个简单,操作简单,独立性强的数据库,因为也是开源的,之后就在开源社区流行起来,很多开发者都开始使用sqlite数据库。 定义:Sqlite是是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,是为了嵌入式系

门徒07的博客 5881

Android数据库SQLite

文章目录创建数据库升级数据库添加数据 Android系统竟然是内置了数据库的,SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百KB的内存就足够了,因而特别适合在移动设备上使用。SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,SQLite又比一般的数据库要简单得多,它甚至不用设置用户名和密码就可以使用 文件存储和SharedPreferences存储毕竟只适用于保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据的时候,你就会发现以上两种存.

Hedenghui777的博客 1850

Android版本升级同时Sqlite数据库的升级及之前数据的保留

做Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了。 SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。 并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段: 1 ALTER TABLE Sub

u011494050的专栏 896

Sqlite 数据库的相关操作

1.将数据库保存到手机内存中     1.1操作方式比较简单,我们只需要编写一个类继承SQLiteOpenHelper类来完成相关的操作 public class SqliteHelper extends SQLiteOpenHelper { private final static String DATABLBASE_NAME = "message.db"; private fina

lzqjfly的专栏 826

Android_SQLite数据库存储

一个现有的数据库(如果数据库已存在就直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。这两个方法不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则出现异常。SQLiteDatabase中提供了一个insert()方法,这个方法是专门用于添加数据的。由于我在执行完delete()方法会,手动的抛出了一个空指针异常,所以,数据库没有成功的删除我的数据。

m0_71272694的博客 1402

Android SQLite数据库查看的三大实战路径

SQLite是Android原生数据持久化的基石,其嵌入式、文件级、无服务的特性决定了数据库可观测性直接关联开发效率与线上稳定性。理解SQLite在Android中的运行机制(如WAL日志模式、私有沙盒路径、只读/读写实例差异),是解决‘查不到数据’‘导出失败’‘Inspector为空’等高频问题的前提。技术价值在于打通开发、测试、上线三阶段的数据可见性闭环:开发期依赖Database Inspector实现实时内存态观测;测试期通过ADB安全导出+桌面工具完成离线验证;上线期借助日志化采样实现合规、低侵入

weixin_34224941的博客 399

android sqlite数据库代码,android sqlite数据库代码

关于android sqlite数据库代码的搜索结果回答在程序的中我从assets中复制了SQLite数据库,可以使用。当把程序第一次安装在仿真器中运行时,获得以下错误。Failed to open the database.closing it. android.database.sqlite.SQLiteCantOpenDatabaseException:...a1234566782019-1...

weixin_42110070的博客 413

Android SQLite数据库介绍、Android Studio代码建数据库建表

SQLite使用 1 创建工具类mySQLiteOpenHelper 继承 SQLiteOpenHelper,使用单例模式获取到实例 2 创建数据库getWritableDatabase() 3 创建表db.execSQL(sql)

m0_45877477的博客 4138

Android学习:学习使用SQLite数据库(创建数据库,升级数据库,及对数据的CRUD操作)

一、简单的介绍SQLite数据库 1、SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite. 2、SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调...

shexianyu的博客 1019
上一篇: JNI常用函数(转)
下一篇: C宏定义
Li Chuan
博客等级 码龄14年 0粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值