关于Android数据库升级的实践(以ormlite为例)
来源:互联网 发布:用一套好还是用淘宝好 编辑:程序博客网 时间:2024/04/29 14:12
在我们的安卓开发中,难免会使用到本地存储,而android本地数据库就是一样比较好,能更灵活存储和查询本地数据,但是随着需求的不断变化,难免要对本地数据库的表或者表的某个字段进行操作,而又不想破坏已经存储在安卓手机里的旧数据,那么怎么办呢?呵呵,安卓数据库已经帮我们想到了,就是本地数据库升级,当然也可以数据库降级,类似吧。
Android 本地数据库又叫SQLite,它有自己的一些原则:
1. 我们只能重命名据据库中的表名和向旧表中增加新的字段
2. Android版SQLite不支持修改表中的字段名和删除表中的字段,也不允许改变表中字段的约束条件(但是修改也可以通过增加来实现,我这里叫它打引号的’修改’)
3. Android版SQLite在存储字段数据时不分类型,所以可以改变字段的类型而无需要升级
(参考地址:http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_4.html#Upgrading-Schema)
下面就让我使用例子来实践数据库的中字段的增加和’修改’字段吧
下面就让我使用例子来实践数据库的中字段的增加和’修改’字段吧
首先就去下载数据库工具的jar包,我找了一个地址:http://www.java2s.com/Code/Jar/o/Downloadormliteandroid418javadocjar.htm
当然也可以去看看他的源码:https://github.com/j256
看看我们的DatabaseHelper.java
public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static final String TABLE_NAME = "upgrade_example.db"; public final static int version = 3; // 数据库版本 private Map<String, Dao> daos = new HashMap<String, Dao>(); /** * userDao ,每张表对于一个 */ private Dao<UserInfo, Integer> userDao; private DatabaseHelper(Context context){ super(context, TABLE_NAME, null, version); } @Override public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { Log.e(DatabaseHelper.class.getName(), "DatabaseHelper onCreate() is invoked..."); try { TableUtils.createTable(connectionSource, UserInfo.class); } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase database,ConnectionSource connectionSource, int oldVersion, int newVersion) { Log.e(DatabaseHelper.class.getName(), "DatabaseHelper onUpgrade() oldVersion:"+oldVersion+",newVersion:"+newVersion); if(oldVersion<2){ try { getUserDao().executeRaw("ALTER TABLE `tb_user_info` ADD COLUMN age INTEGER DEFAULT 0;");} catch (SQLException e) {e.printStackTrace();} } if(oldVersion<3){ try { getUserDao().executeRaw("ALTER TABLE `tb_user_info` ADD COLUMN addr TEXT DEFAULT 'china';"); getUserDao().executeRaw("ALTER TABLE `tb_user_info` ADD COLUMN sex TEXT DEFAULT '男';"); getUserDao().updateRaw("UPDATE `tb_user_info` SET sex = '女' WHERE gender = 1;");} catch (SQLException e) {e.printStackTrace();} } } private static DatabaseHelper instance; /** * 单例获取该Helper * * @param context * @return */ public static synchronized DatabaseHelper getHelper(Context context) { if (instance == null) { synchronized (DatabaseHelper.class) { if (instance == null) instance = new DatabaseHelper(context); } } return instance; } public synchronized Dao getDao(Class clazz) throws SQLException { Dao dao = null; String className = clazz.getSimpleName(); if (daos.containsKey(className)) { dao = daos.get(className); } if (dao == null) { dao = super.getDao(clazz); daos.put(className, dao); } return dao; } /** * 获得userDao * * @return * @throws SQLException */ public Dao<UserInfo, Integer> getUserDao() throws SQLException{ if (userDao == null){ userDao = getDao(UserInfo.class); } return userDao; } /** * 释放资源 */ @Override public void close(){ super.close(); userDao = null; }}以用户为例的UserInfo.java
@DatabaseTable(tableName = "tb_user_info")public class UserInfo {@DatabaseFieldprivate int id;//id@DatabaseFieldprivate String name;//名称@DatabaseFieldprivate int gender;//性别 0:男,1:女public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getGender() {return gender;}public void setGender(int gender) {this.gender = gender;}/*@Override public String toString() {//database version=1 return "UserInfo [id=" + id + ", name=" + name + ",gender="+gender + "]"; }*/// database version=2 added@DatabaseFieldprivate int age;//age public int getAge() {return age;}public void setAge(int age) {this.age = age;}/*@Override public String toString() {//database version=2 return "UserInfo [id=" + id + ", name=" + name+ ", age=" + age + ",gender="+gender + "]"; }*///database version=3 added@DatabaseFieldprivate String sex;//修改字段@DatabaseFieldprivate String addr;//增加字段 public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}@Override public String toString() { return "UserInfo [id=" + id + ", name=" + name + ", age=" + age+",sex="+sex+",addr="+addr + "]"; }}这两个主要文件贴出来了,那么我再把主界面的初始化的代码贴一下:
private void initDatabaseDefaultVal(){SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this);boolean isHadInitDatabase=prefs.getBoolean("isHadInitDatabase", false);if(!isHadInitDatabase){ArrayList<UserInfo> userList=new ArrayList<UserInfo>();UserInfo user=new UserInfo();user.setId(1);user.setName("李明");user.setGender(0);userList.add(user);user=new UserInfo();user.setId(2);user.setName("张婷");user.setGender(1);userList.add(user);user=new UserInfo();user.setId(3);user.setName("王强");user.setGender(0);userList.add(user);try {DatabaseHelper.getHelper(this).getUserDao().create(userList);Editor editor=prefs.edit();editor.putBoolean("isHadInitDatabase", true);editor.commit();} catch (SQLException e) {e.printStackTrace();Log.e(this.getClass().getName(), "init database occupt SQLException!");}}}
好了,我就讲讲我的升级过程(如下图):
一开始我在tb_user_info这张表中,只有id,name,gender这三个字段,这时的数据库版本为1
打印出来的日志如下图
现在升级为版本2,在UserInfo里面增加age(随便把toString()也变一下),把DatabaseHelper的version设置为2,在DatabaseHelper增加onUpgrade函数,写上如下代码:
if(oldVersion<2){ try { getUserDao().executeRaw("ALTER TABLE `tb_user_info` ADD COLUMN age INTEGER DEFAULT 0;");} catch (SQLException e) {e.printStackTrace();} }
运行结果如下图:
现在升级为版本3,在UserInfo里面增加addr和sex(随便把toString()也变一下),把DatabaseHelper的version设置为3,在DatabaseHelper的onUpgrade函数增加上如下代码:
if(oldVersion<3){ try { getUserDao().executeRaw("ALTER TABLE `tb_user_info` ADD COLUMN addr TEXT DEFAULT 'china';"); getUserDao().executeRaw("ALTER TABLE `tb_user_info` ADD COLUMN sex TEXT DEFAULT '男';"); getUserDao().updateRaw("UPDATE `tb_user_info` SET sex = '女' WHERE gender = 1;");} catch (SQLException e) {e.printStackTrace();} }运行结果如下图:
当然也可以从版本1直接长到版本3,效果如下图:
好了,实践已经结束,我会把源代码上传上来,地址:http://download.csdn.net/detail/bright789/9447167
- 关于Android数据库升级的实践(以ormlite为例)
- Android数据库ORMLite版本升级及数据的迁移
- OrmLite数据库升级
- Android 使用OrmLite 实现数据库升级版本控制
- Android数据库ORMLite框架的注解
- Android数据库框架ORMLite的学习笔记
- Android 数据库开始开发ORMLite的使用
- android数据库框架ormlite的使用
- Android中OrmLite数据库的使用
- Android ORMLite 框架的入门用法-数据库
- Android数据库框架-----ORMLite 的基本用法
- Android基于ormlite框架的数据库加密
- Android 数据库框架OrmLite的常规使用
- Android数据库ORMlite框架
- android Ormlite数据库更新
- Android ORMLite数据库简介
- Android数据库使用(ORMLite)
- Android数据库ORMlite框架
- 超级简单的Android Studio jni 实现(无需命令行)
- java垃圾回收是怎么回事
- java笔记
- android studio 程序真机运行中文显示乱码
- 基于彻底解耦合的实验性iOS架构
- 关于Android数据库升级的实践(以ormlite为例)
- love
- java ee 13种技术
- C# 中线程资源访问互斥锁
- Data Structures And Problem Solving Using Java (Fourth Edition)中译版(Java static关键字)
- 该不该和教师一起去做项目
- 本机与虚拟机中的Ubuntu传递文件 (待完善)
- UIControl 的基本使用方法和 Target-Action 机制
- android下使用gzip压缩提升访问server api的效率