Android onUpdate

从开始一直不知道这个东西是干什么的,数据库的版本号也是随便定义的,还有两个版本号。

Android在设计时,就考虑到了数据库的更新。当检测到版本有变化时,就会对数据库更新,执行这个操作。


所以定义数据库的版本还是比较重要的,如第一个程序版本时定义的数据库版本为1,在程序发布新版时有对数据库更新操作,可能增加表,增加列,如果没有调整这个版本,数据库不会创建新的表,也不会添加新的列,安装新版的程序就会崩溃了。


查了一些资料终于明白了。
ContactsDatabaseHelper这个是系统 联系人的源码中的一个类,里面已经定义了版本为353,

@Override
    public void onUpgrade(SQLiteDatabase db,
int oldVersion, int newVersion) {}在这个方法里处理了更新

大概代码是这样的
Java代码

?1.?if (oldVersion < 99) {直接删除所有的表,重建,有可能是变化太大的问题吧。} 
?2.? 

?3.?if (oldVersion == 100) { 
?4.?CREATE INDEX创建一个新的索引 

?5.?oldVersion++;增加旧版本号, 
?6.?} 

?7.?。。。之后多个操作,依次增加版本号。 
?8.? 
?9.?if (oldVersion == 105)


?10.?           
upgradeToVersion202(db);//直接增加到202 

?11.?           
oldVersion = 202; 
?12.?       

?13.? 
?14.?对于数据库的版本号还要严格地处理。 
?15.?这里
对oldVersion操作完成后需要与newVersion一样,才算升级成功。 
?16.?if (oldVersion !=
newVersion) { 
?17.?throw new IllegalStateException( 

?18.?         "error upgrading the
database to version " + newVersion); 
?19.?} //当然这不是强制要求的, 

?20.?upgrade就结束了。 

?21.?这样数据库版本号就是newVersion,如果下一次要升级,就至少要比这个高才会触发。 


也许有人会问,如果当前的表的存了数据,程序又不愿重新安装,更新数据库时要保留原来的数据怎么办呢?

以上的版本升级是必然要做的事,但是没有提到数据更新的问题。
如果不是删除原来的表格,只是增加了一列,可能会要求对这列赋默认的值


Java代码
?1.?上面有一个跨度较大的就是100多到202的升级: 

?2.?upgradeToVersion202(SQLiteDatabase db)看这个方法: 

?3.?db.execSQL( 

?4.?               
"ALTER TABLE " + Tables.PHONE_LOOKUP + 

?5.?               
" ADD " + PhoneLookupColumns.MIN_MATCH + " TEXT;"); 
?6.?增加了一列。 

?7.? 
?8.?SQLiteStatement update = db.compileStatement( 

?9.?               
"UPDATE " + Tables.PHONE_LOOKUP + 

?10.?               
" SET " + PhoneLookupColumns.MIN_MATCH + "=?" + 

?11.?               
" WHERE " + PhoneLookupColumns.DATA_ID + "=?"); 
?12.?创建更新语句。 

?13.? 
?14.?Cursor c = db.query(Tables.PHONE_LOOKUP + " JOIN " +
Tables.DATA + 

?15.?               
" ON (" + PhoneLookupColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID +
")", 

?16.?               
new String[]{Data._ID, Phone.NUMBER}, null, null, null, null, null); 

?17.?处理新的列。 
?18.? 
?19.?更新数据。 
?20.?try { 

?21.?           
while (c.moveToNext()) { 

?22.?               
long dataId = c.getLong(0); 

?23.?               
String number = c.getString(1); 

?24.?               
if (!TextUtils.isEmpty(number)) { 

?25.?                   
update.bindString(1, PhoneNumberUtils.toCallerIDMinMatch(number)); 

?26.?                   
update.bindLong(2, dataId); 

?27.?                   
update.execute(); 

?28.?               


?29.?           

?30.?        } finally { 

?31.?           
c.close(); 
?32.?        } 

?33.?这就是处理数据更新的过程。 

博客文章列表居然发现三个,删除一个就全没了。这次格式乱了

Android onUpdate

时间: 2024-08-07 20:03:17

Android onUpdate的相关文章

Android中使用SQLite

Android系统内置了对SQLite数据库的支持,并提供了帮助类SQLiteOpenHelper.我们在开发时需要新建一个类继承SQLiteOpenHelper,并重写onCreate和onUpdate方法.onCreate方法仅在第一次新建数据库时调用,主要做创建表的操作.onUpdate方法在数据库版本更新时调用,根据业务需要做一些表的创建.删除.表结构改变等操作.同时需要实现一个构造函数,向父类的构造函数传入上下文对象.数据库名称.游标工厂和版本号.以下是一个简单的示例: 1 publi

AppWidget 如android桌面上的时钟

一. 1.App widget 是在home桌面的一个空间,比如时钟,播放器播放时小图标可以点击下一首等那个. 2.AppWidgetProviderInfo 对象: 为App Widget 提供元数据,包括布局,更新频率等数据,这个对象被定义在xml文件当中. 3.AppWidgetProvider : 定义一个App Widget 的基本生命周期函数. 二.创建App Widget步骤: 1.定义AppWidgetProviderInfo : 在res/xml文件夹中定义 example_a

Android 多线程下载,断点续传,线程池

你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的效果图. 多线程下载原理 多线程下载的原理就是将下载任务分割成一个个小片段再将每个小片段分配给各个线程进行下载. 例如一个文件大小为100M,我们决定使用4个线程下载,那么每个线程下载的大小即为25M,每个线程的起始以及结束位置依次如下: 0: 0-25M 1: 25-50M 2: 50-75M 3

Android 程序员必须知道的 53 个知识点

1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式运行来看都是 startActivity 可能会使用 FLAG_ACTIVITY_NEW_TASK 标记来打开一个新窗口,比如 Launcher,所以考虑单任务的实现方法比较简单,首先 Android123 纠正下大家一种错误的方法就是直接在androidmanifest.xml 的 applica

基础篇:6.Android数据库编程---SQLite

简介: 在Android平台上,继承了一个嵌入式关系型数据库---SQLite.SQLite具有跨平台特性,可以在所有主要的操作系统上运行.SQLite通过独占性和共享锁实现独立事务处理,因此多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据,在进行写操作之前,必须先获得独占锁.另一方面,SQLite采取动态数据类型,当某个值插入数据库时,SQLite会检查它的类型,如果该类型与所关联的列不匹配,SQLite则会进行强制转换.SQLite支持以下几种数据类型:NULL(空值).I

在Android中利用SQLite实现对数据的增删查改

停更了一天,I'm back again~~当我们需要操作大量的数据时,我们首先想到的当然是数据库,因为可以通过简单的语句实现数据的增删改查,在Android中,我们不使用SQL或者ORACLE,我们使用SQLite,因为它占用资源更少,而语句格式与SQL语句一样. 首先,我们来在Android中实现数据库的创建与增删改查,引用数据库的类时,不再继承常用的Activity类,而是继承Android中的SQLiteOpenHelper,创建一个构造方法,四个参数分别是(Context contex

Android清单文件详解(四) ---- backupAgent的用法

在<application>节点中有一个非常重要的属性,那就是backupAgent.这里我们将它单独列出来,从基本含义,用法及其相关属性等方面来详细介绍一下. 1.backupAgent简介 android:backupAgent用来设置备份代理.对于大部分应用程序来说,都或多或少保存着一些持久性的数据,比如数据库和共享文件,或者有自己的配置信息.为了保证这些数据和配置信息的安全性以及完整性,Android提供了这样一个机制. 我们可以通过这个备份机制来保存配置信息和数据以便为应用程序提供恢

[Android]组件-进度条1

多式样ProgressBar 普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中. 一般只要在XML布局中定义就可以了. <progressBar android:id="@+id/widget43" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layou

android 创建桌面小部件widget

1. 创建自定义widget的广播类,继承自 AppWidgetProvider(有了这个广播就会在widgets中能够选择了吗?)这个广播的生命周期主要有五个,在第一个widget拖动到桌面和最后一个widget删除和已经有widget时拖动到桌面的生命周期是不同的 根据对生命周期的分析,在onUpdate中进行初始化,在onDisabled中进行销毁(关闭服务). public class ProcessWidgetReceiver extends AppWidgetProvider { p